计算机图形学上机(一)改进的DDA算法
改進DDA:
基于VS2019,調用OPENGL的改進DDA算法,在原來的DDA算法上將劃線的部分進行了修改,代碼是基于在網上找到的DDA算法進行修改。改掉的部分基本屬于文獻中直接復制引用。寫出來并不費勁,但需要自己進行理解體會。
原理分析:
令 d 表示 y+0.5的小數部分, 因此在區間[0,1)上,小數部分d是以k為增量的單調遞增序列;而k>0,則d在經 過一定次數的遞增后必然會有d≥ 1,此時 只要令d=d-1,d必然會重新變成區間[0,1) 上的實數。通過以上分析, 可以將直線劃分為m 段:L0 ,L1 ,L2…L m-1;每一段上像素點的y+0.5的小數部分 d 都是區間[0,1)上的單調遞增序列。因此只要繪制出小數為 di 時候的像素 點然后通過水平移動即可得到多個像素點。
例:繪制(0,0) (10,2)的直線 該直線的斜率為0.2
從表 1 中可看出,根據小數的變化規律 可將該直線分為 3 段分別繪制。 d 有 3 個單調遞增的序列,分別是{0.5, 0.7,0.9},{0.1,0.3,0.5,0.7,0.9},{0.1,0. 3,0.5}。 則可將這 11 個像素點分成 3 段輸出。
代碼如下,注釋掉的部分即最開始的DDA算法 #include<math.h> #include<gl/glut.h> #include<iostream> using namespace std;void myDisplay(void);//調用lineDDA void setPixel(int x, int y);//在OpenGL中可以用glVertex來實現 int around(const float a); void ChangeSize(GLsizei w, GLsizei h); void ddaline(int x0, int y0, int xEnd, int yEnd);void myDisplay(void) {ddaline(50, 50, 150, 70); }void setPixel(int x, int y) {//用OpenGL自己的函數實現書上的setPixelglPointSize(5.0f);glBegin(GL_POINTS);glVertex2i(x, y);glEnd();glFlush(); }int around(const float a) {return int(a + 0.5); }//窗口大小改變時調用的登記函數 void ChangeSize(GLsizei w, GLsizei h) {if (h == 0)h = 1;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(0.0f, 250.0f, 0.0f, 250.0f * h / w, 1.0, -1.0);elseglOrtho(0.0f, 250.0f * w / h, 0.0f, 250.0f, 1.0, -1.0); }//void lineDDA(int x0, int y0, int xEnd, int yEnd) { // glPointSize(3.0f);//設置像素點大小 // int dx = xEnd - x0, dy = yEnd - y0, steps, k; // float xIncrement, yIncrement, x = x0, y = y0; // if (abs(dx) > abs(dy))//確定步長,誰大就取誰 // steps = abs(dx); // else // steps = abs(dy); // xIncrement = float(dx) / float(steps);//增量當中有一個會為1,另一個會為斜率k // yIncrement = float(dy) / float(steps); // setPixel(around(x), around(y));//由于每次都加了小于1的增量,所以需要取整 // for (k = 0; k < steps; k++) { // x += xIncrement; // y += yIncrement; // setPixel(around(x), around(y)); // } //}void ddaline(int x0, int y0, int x1, int y1) {int x = x0, t, m; /* m 為直線的段數 */float k, dx, dy, d;dx = x1 - x0;dy = y1 - y0;k = dy / dx;d = 0.5;for (m = 0;; m++){t = y0 + m;while (d < 1){setPixel(x++, t);d = d + k;if (x > x1) break;}if (x > x1) break;d = d - 1;} }int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(200, 200);glutInitWindowSize(400, 400);glutCreateWindow("輸入線");glutDisplayFunc(&myDisplay);glutReshapeFunc(ChangeSize);glutMainLoop();return 0; }}
opengl的配置https://blog.csdn.net/lofone/article/details/103625169?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162071928216780265452111%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162071928216780265452111&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-8-103625169.pc_search_result_cache&utm_term=opengl+VS2019&spm=1018.2226.3001.4187
改進的直線DDA算法_王茂華https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&dbname=CJFD2009&filename=ZXLJ200904215&v=2ePGOQYw%25mmd2FGPOAWV4DbCZIVUD%25mmd2BMYHUeU02%25mmd2BbAyy5ponc8BujkXBkT9WXQ7gR6Df7S
總結
以上是生活随笔為你收集整理的计算机图形学上机(一)改进的DDA算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 处理dat文件画图,mat
- 下一篇: 【SDOI2008】仪仗队