OpenGL图形学中的DDA算法
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)代碼:
總結(jié)
以上是生活随笔為你收集整理的OpenGL图形学中的DDA算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7录屏_这款高清免费无水印的录屏软
- 下一篇: c语言堆栈基本代码入栈出栈_c语言的简单