這篇主要講掃瞄轉換方法光柵化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...