OpenGL图形学中的DDA算法
生活随笔
收集整理的這篇文章主要介紹了
OpenGL图形学中的DDA算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DDA(Digital Differential Analyzer):數字積分法
計算機中,直線并不是連續的,二是離散的點,這是光珊化的本質決定的。
兩點確定一條直線,假設如果給出了起點和終點分別是(x1,y1),(x2,y2),假設這條直線為 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
考慮到不能讓直線出現中斷的情況,
斜率|m|<1時,要以x軸為步進的主方向,?y每次比較小。
斜率|m|>1時,要以y軸為步進的主方向,?x每次比較小。
經過上述知識點描述,DDA算法的實現思路如下:
??聲明double類的變量dx,dy,e,x,y,其中dx和dy作為步進長度,e作為循環次數,x和y記錄每次畫點的坐標;dx=x2-x1,dy=y2-y1,計算斜率,如果斜率小于1則選擇x為主步進方向,反之y為主步進方向。循環e次,每次循環畫一個點,這里我選擇x每次增大0.5,同時要將變化后的點從浮點類型轉換為整型,同時更新下一次的x和y值。
關鍵部分代碼:
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;} }實現效果:
可以看到畫出了一條直線。
舉個例子手動用DDA畫一下點:
完整實現代碼:
總結
以上是生活随笔為你收集整理的OpenGL图形学中的DDA算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7录屏_这款高清免费无水印的录屏软
- 下一篇: c语言堆栈基本代码入栈出栈_c语言的简单