日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL图形学中的DDA算法

發(fā)布時(shí)間:2023/12/9 编程问答 88 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL图形学中的DDA算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

DDA(Digital Differential Analyzer):數(shù)字積分法

計(jì)算機(jī)中,直線并不是連續(xù)的,二是離散的點(diǎn),這是光珊化的本質(zhì)決定的。

兩點(diǎn)確定一條直線,假設(shè)如果給出了起點(diǎn)和終點(diǎn)分別是(x1,y1),(x2,y2),假設(shè)這條直線為 y = mx + b,那么斜率m就是:
m = dy / dx = (y2 - y1) / (x2 - x1)
b = (x2y1 - x1y2) / (x2 - x1)

有限差分近似解是:
x(i+1) = x(i) + ?x
y(i+1) = y(i) + ?y = y(i) + ((y1 - y1) / (x2 - x1)) * ?x

考慮到不能讓直線出現(xiàn)中斷的情況,
斜率|m|<1時(shí),要以x軸為步進(jìn)的主方向,?y每次比較小。
斜率|m|>1時(shí),要以y軸為步進(jìn)的主方向,?x每次比較小。

經(jīng)過上述知識(shí)點(diǎn)描述,DDA算法的實(shí)現(xiàn)思路如下:
??聲明double類的變量dx,dy,e,x,y,其中dx和dy作為步進(jìn)長(zhǎng)度,e作為循環(huán)次數(shù),x和y記錄每次畫點(diǎn)的坐標(biāo);dx=x2-x1,dy=y2-y1,計(jì)算斜率,如果斜率小于1則選擇x為主步進(jìn)方向,反之y為主步進(jìn)方向。循環(huán)e次,每次循環(huán)畫一個(gè)點(diǎn),這里我選擇x每次增大0.5,同時(shí)要將變化后的點(diǎn)從浮點(diǎn)類型轉(zhuǎn)換為整型,同時(shí)更新下一次的x和y值。

關(guān)鍵部分代碼:

void DDA_Line(int x1, int y1, int x2, int y2) {double dx, dy, e, x, y;dx = x2 - x1;dy = y2 - y1;e = (fabs(dx) > fabs(dy)) ? fabs(dx) : fabs(dy);dx /= e;dy /= e;x = x1;y = y1;for (int i = 0; i < e; i++) {glPointSize(5.0);glBegin(GL_POINTS);glVertex2i(int(x + 0.5), int(y + 0.5));glEnd();glFlush();x += dx;y += dy;} }

實(shí)現(xiàn)效果:

可以看到畫出了一條直線。

舉個(gè)例子手動(dòng)用DDA畫一下點(diǎn):


完整實(shí)現(xiàn)代碼:

#include <GL/glut.h> #include <math.h>void DDA_Line(int x1, int y1, int x2, int y2) {double dx, dy, e, x, y;dx = x2 - x1;dy = y2 - y1;e = (fabs(dx) > fabs(dy)) ? fabs(dx) : fabs(dy);dx /= e;dy /= e;x = x1;y = y1;for (int i = 0; i < e; i++) {glPointSize(5.0);glBegin(GL_POINTS);glVertex2i(int(x + 0.5), int(y + 0.5));glEnd();glFlush();x += dx;y += dy;} }void display(void) {glClearColor(1.0, 1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glViewport(0, 0, 500, 500);DDA_Line(0, 500, 500, 0);glFlush(); }int main(int argc, char **argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RED);glutInitWindowSize(500, 500);glutInitWindowPosition(0, 0);glutCreateWindow("DDA_line");glutDisplayFunc(display);glColor3f(0.0, 1.0, 1.0);//顏色gluOrtho2D(0.0, 500.0, 0.0, 500.0);glutMainLoop();return 0; }

總結(jié)

以上是生活随笔為你收集整理的OpenGL图形学中的DDA算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。