光栅渲染器(二)画线
生活随笔
收集整理的這篇文章主要介紹了
光栅渲染器(二)画线
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇著重光柵化2D直線的算法實現
一、數據結構設置
//************************基本數據結構******************* typedef struct { float x, y; } vector_t; typedef vector_t point_t;//頂點typedef struct { float r, g, b,a; } color_t;//顏色目前還是2d,也不需要3d變換,暫時只需要x,y2個坐標數據
二、DDA畫線算法
void DrawLineDDA2d(point_t v1, point_t v2,color_t c)//DDA畫線算法 {glColor4d(c.r, c.g, c.b,c.a);float x1 = v1.x;float y1 = v1.y;float x2 =v2.x;float y2 = v2.y;float length = __max(abs(x1 - x2), abs(y1 - y2));float dx = (x2 - x1) / length;float dy = (y2 - y1) / length;float x = x1 + 0.5;float y = y1 + 0.5;int i = 0;while (i <= length){glVertex2i((int)x, (int)y);x += dx;y += dy;i++;}}此算法參考《計算機圖形學的算法基礎》
利用公式完成繪制
三、中點畫線算法
void DrawLineMid(point_t v1, point_t v2,color_t c)//中點畫線算法 {glColor4d(c.r, c.g, c.b, c.a);float x1 = v1.x;float y1 = v1.y;float x2 = v2.x;float y2 = v2.y;float dx = x2 - x1;float dy = y2 - y1;float d = dy - dx;int x = x1+0.5;int y = y1+0.5;glVertex2i((int)x1, (int)y1);while (x < x2){if (d >= 0){glVertex2i(x++, y);d -= dy;}else if (d < 0){glVertex2i(x++, y++);d += dy - dx;}} }這個算法僅限第一象限
希望擴展到全坐標系,參考無幻博客
http://blog.csdn.net/akof1314/article/details/5447652
四、Bresenham算法
void DrawLineBre(point_t v1, point_t v2, color_t c)//Bresenham算法 {glColor4d(c.r, c.g, c.b, c.a);float x1 = v1.x;float y1 = v1.y;float x2 = v2.x;float y2 = v2.y;int x = x1;int y = y1;float dx =abs(x1-x2);float dy = abs(y2 - y1);int s1 = Sgn(x2 - x1);int s2 = Sgn(y2 - y1);bool IntChange = false;if (dy > dx){swap(dy, dx);IntChange = true;}float e = 2 * dy - dx;for (int i = 0; i < dx; i++){glVertex2i(x, y);if(e>0){if (IntChange)x += s1;else x += s2;e =e- 2*dx;}if (IntChange) y += s2;else y += s1;e += 2 * dy;} }五、測試畫線案例
void myDisplay(void) {glClear(GL_COLOR_BUFFER_BIT); // 清屏幕 glPointSize(1);glBegin(GL_POINTS);point_t v1{ 10,15 };point_t v2{ 400,405 };point_t v3{ 100,405 };color_t c{ 1.0,1.0,0,1.0 };//黃色DrawLineBre(v1,v2,c);glEnd();glFlush(); // 將所有輸出到顯示屏上 }總結
以上是生活随笔為你收集整理的光栅渲染器(二)画线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cocos2d-x 3.17.2 调用c
- 下一篇: Cocos Studio images文