光柵渲染器(三)光柵化2D三角形

2021-08-09 23:16:58 字數 2453 閱讀 9159

這篇主要講掃瞄轉換方法光柵化2d三角形

之前我們已經完成了線段的繪製,而三角形其實3條線段的首尾相連,所以我們只要給出三個不在同一直線的頂點就能繪製三角形

bresenham演算法是種相對高效的演算法,但目前我專案中的這一演算法在頂點x座標或y座標相同時還無法完成繪製。所以這一情況下,我選擇dda演算法取代。

如下

void drawline(point_t v1, point_t v2, color_t c)

else

}

這樣一來就完成了相對高效且完全通用的畫線演算法

演算法很簡單,就是繪製三條首尾相連的三角形

void draw********(point_t v1, point_t v2, point_t v3,color_t c)

接下來在重繪函式裡測試**

// 重繪函式

void mydisplay(void)

; point_t v2;

point_t v3;

color_t c;//黃色

draw********(v1, v2, v3, c);

glend();

glflush(); // 將所有輸出到顯示屏上

奇怪這個三角形怎麼只有線段,好吧,我們需要填充三角形

int sgn(float d)//符號判斷

// 計算插值:t 為 [0, 1] 之間的數值

float interp(float x1, float x2, float t)

我們需要用乙個個線段填充三角形的內部

這是乙個平底三角形,我們可以通過從最上方頂點開始從上而下繪製線段

//掃瞄轉換填充三角形

之前的演算法只適合平底三角形,接下來我們把之前演算法拓展到任何一種三角形

我們可以發現任何乙個三角形都是由2個平底三角形組成,只要讓他的頂點根據y座標排序,挑選出y座標大小排序在中間的點,做平行x軸的直線,就可以將任何乙個非平底或平頂三角形分割成2個平底或平頂三角形。

演算法實現如下

void draw********(point_t v1, point_t v2, point_t v3,color_t c)

; sort(pointy.begin(), pointy.end());

float midy = pointy[1];

float miny = pointy[0];

float maxy = pointy[2];

point_t maxypoint;

point_t midypoint;

point_t minypoint;

if (midy != miny && midy != maxy)

if (maxy == v3.y)

}else

if (midy == v2.y)

if (maxy == v3.y)

}else

if (midy == v3.y)

if (maxy == v2.y)

}point_t newv;

float t = (midy - maxy) / (miny - maxy);

newv.x = interp(maxypoint.x, minypoint.x, t);

newv.y = midy;

draw********_scanconversion(maxypoint, midypoint, newv, c);

draw********_scanconversion(minypoint, midypoint, newv, c);

}else

}

我寫的頂點排序演算法有些複雜,我又心急接下來光柵渲染器的實現,就先不在這裡糾結了,如果大家有更好的演算法,希望告知

最終完成了,乙個簡陋,實現演算法糟糕的2d三角形

D 空心三角形

把乙個字元三角形掏空,就能節省材料成本,減輕重量,但關鍵是為了追求另一種視覺效果。在設計的過程中,需要給出各種花紋的材料和大小尺寸的三角形樣板,通過電腦臨時做出來,以便看看效果。input 每行包含乙個字元和乙個整數n 0a 7 sample output x aa a a a a a a a a ...

三角形類2

corpyright c 2013,煙台大學計算機學院 all right reseved.完成日期 2014年3月18日 版本號 v1.0 輸入描述 問題描述 三角型類2 程式輸出 問題分析 演算法設計 include include using namespace std class int m...

三角形類2

程式的版權和版本宣告部分 檔名稱 三角形類 作 者 馮冬影 完成日期 2014 年 3月 18 日 版 本 號 v1.0 對任務及求解方法的描述部分 輸入描述 問題描述 三角形類 程式輸出 問題分析 include includeusing namespace std class inline vo...