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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

光栅渲染器(二)画线

發布時間:2023/12/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 光栅渲染器(二)画线 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇著重光柵化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(); // 將所有輸出到顯示屏上 }

總結

以上是生活随笔為你收集整理的光栅渲染器(二)画线的全部內容,希望文章能夠幫你解決所遇到的問題。

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