多邊形的掃描轉換(X-掃描線算法)
一、兩種表示方法
把多邊形的頂點表示轉換為點陣表示稱為多邊形的掃描轉換。
二、X-掃描線算法
圖1 圖2
1.步驟
a. 求交
b. 排序:把所有交點按遞增順序排序
為何要進行排序?
答:按交點x值遞增排序,確保交點兩兩配對時填充區間的正確性。
c. 交點配對:確定填充區間
d. 區間填色
2.交點取舍(當掃描線與多邊形頂點相交時,交點如何取舍?)
兩邊只取1,同邊0或2。
三、X-掃描線算法的改進
1. 三方面的改進
a. 處理一條掃描線,僅對與它相交的多邊形的邊(有效邊)進行求交運算。(也就是避免把所有的邊都進行求交,因為大部分的邊求交結果為空。所以設置一個表來記錄有效邊。即下面提到的AET)
b. 考慮邊的連貫性:當前掃描線與各邊的交點順序與下一條掃描線與各邊的交點順序很可能相同或非常相似。
c. 多邊形的連貫性:當某條邊與當前掃描線相交時,它很可能也與下一條掃描線相交。
2.數據結構
通過引入新的數據結構來避免求交運算
(1)活性邊表
a. 活性邊表(AET):把和當前掃描線相交的邊稱為活性邊,並把它們按交點x坐標遞增的順序存於一個鏈表中。
b. 結點內容
Δx=1/k,ymax 是為了知道何時達到邊界
c. 舉例
(2)新邊表(NET)
建立AET需要知道與哪些邊相交,所以定義NET來存儲邊的信息,從而方便AET的建立。
a. 構造一個縱向鏈表,長度為多邊形占有的最大掃描線數。每個節點(稱為吊桶)對應多邊形覆蓋的一條掃描線。
b. 結點內容
ymax:該邊的y最大值
xmin:該邊較低點的x坐標
c. NET掛在與該邊較低端y值相同的掃描線吊桶中
此時NET也就記錄了6條有效邊
(3)NET與AET的使用流程
首先我們得明白,AET的目的是為了使用增量方法避免求交運算,而NET是用在構造AET的。
a. 所以第一步為構造NET。
方法:遍歷所有掃描線,把ymin = i 的邊放進NET[ i ]中,從而構造出整個NET。
b. 然后構造AET。
方法:循環取出掃描線,直接將此掃描線在NET中的邊結點插入到AET中。此時AET就存儲了哪些邊是有效邊了。
注意:我們來回看2個表里的結點可發現,NET里的1/k、xmin、ymax正好對應AET里的Δx、x、ymax。這也是能用NET構造AET的原因。
c. 區間填色。
方法:取第一條掃描線,在配對點區間中填色。當掃描線達到ymax時,舍棄此邊結點。否則使用增量方法得到下一個配對結點的x坐標。取下一條掃描線,重復c操作。
那么到底是如何實現避免求交的?
答:第一個交點的x坐標是NET中傳到AET的,也就是最低端的點,此點先渲染。然后根據兩條邊的斜率來進行增量方法得到下一對配對交點的x坐標,取下一條掃描線時,
根據x坐標和掃描線y值可得交點的具體坐標,從而用增量方法代替了求交運算。要注意的是:只要掃描線<ymax,那么它對應的NET都是相同的,因為NET掛在與該邊較低
端y值相同的掃描線吊桶中。
偽代碼: