计算机图形学上机(一)改进的DDA算法
改進(jìn)DDA:
基于VS2019,調(diào)用OPENGL的改進(jìn)DDA算法,在原來(lái)的DDA算法上將劃線的部分進(jìn)行了修改,代碼是基于在網(wǎng)上找到的DDA算法進(jìn)行修改。改掉的部分基本屬于文獻(xiàn)中直接復(fù)制引用。寫(xiě)出來(lái)并不費(fèi)勁,但需要自己進(jìn)行理解體會(huì)。
原理分析:
令 d 表示 y+0.5的小數(shù)部分, 因此在區(qū)間[0,1)上,小數(shù)部分d是以k為增量的單調(diào)遞增序列;而k>0,則d在經(jīng) 過(guò)一定次數(shù)的遞增后必然會(huì)有d≥ 1,此時(shí) 只要令d=d-1,d必然會(huì)重新變成區(qū)間[0,1) 上的實(shí)數(shù)。通過(guò)以上分析, 可以將直線劃分為m 段:L0 ,L1 ,L2…L m-1;每一段上像素點(diǎn)的y+0.5的小數(shù)部分 d 都是區(qū)間[0,1)上的單調(diào)遞增序列。因此只要繪制出小數(shù)為 di 時(shí)候的像素 點(diǎn)然后通過(guò)水平移動(dòng)即可得到多個(gè)像素點(diǎn)。
例:繪制(0,0) (10,2)的直線 該直線的斜率為0.2
從表 1 中可看出,根據(jù)小數(shù)的變化規(guī)律 可將該直線分為 3 段分別繪制。 d 有 3 個(gè)單調(diào)遞增的序列,分別是{0.5, 0.7,0.9},{0.1,0.3,0.5,0.7,0.9},{0.1,0. 3,0.5}。 則可將這 11 個(gè)像素點(diǎn)分成 3 段輸出。
代碼如下,注釋掉的部分即最開(kāi)始的DDA算法 #include<math.h> #include<gl/glut.h> #include<iostream> using namespace std;void myDisplay(void);//調(diào)用lineDDA void setPixel(int x, int y);//在OpenGL中可以用glVertex來(lái)實(shí)現(xiàn) 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自己的函數(shù)實(shí)現(xiàn)書(shū)上的setPixelglPointSize(5.0f);glBegin(GL_POINTS);glVertex2i(x, y);glEnd();glFlush(); }int around(const float a) {return int(a + 0.5); }//窗口大小改變時(shí)調(diào)用的登記函數(shù) 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);//設(shè)置像素點(diǎn)大小 // int dx = xEnd - x0, dy = yEnd - y0, steps, k; // float xIncrement, yIncrement, x = x0, y = y0; // if (abs(dx) > abs(dy))//確定步長(zhǎng),誰(shuí)大就取誰(shuí) // steps = abs(dx); // else // steps = abs(dy); // xIncrement = float(dx) / float(steps);//增量當(dāng)中有一個(gè)會(huì)為1,另一個(gè)會(huì)為斜率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 為直線的段數(shù) */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
改進(jìn)的直線DDA算法_王茂華https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&dbname=CJFD2009&filename=ZXLJ200904215&v=2ePGOQYw%25mmd2FGPOAWV4DbCZIVUD%25mmd2BMYHUeU02%25mmd2BbAyy5ponc8BujkXBkT9WXQ7gR6Df7S
總結(jié)
以上是生活随笔為你收集整理的计算机图形学上机(一)改进的DDA算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab 处理dat文件画图,mat
- 下一篇: 【SDOI2008】仪仗队