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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL图形学中的DDA算法

發布時間:2023/12/9 编程问答 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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畫一下點:


完整實現代碼:

#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; }

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。