李泉 陳玉進(南京跬步科技有限公司http://www.creable.cn )
舉例說明如下:如圖2,根據多邊形的座標信息,生成一個算法需要的表結構。生成此表的原則是:以多邊形相鄰兩點組成的線段爲單位,以與該線段相交的y座標最大的掃描線爲依據(其中僅僅有一條線與該線段相交的情況出現時,該線段的相關信息不記錄到表中),將相關信息存儲到表的Y桶中。例如:與線段S1相交的掃描線的y最大值爲5,故S1的相關信息應該寫入Y=5的掃描線中(Y桶中包含若干個掃描線)。
依照上述規則生成的表格如下(線段的信息就是前面設計的Node對象,其格式爲(Xs,Ymin,xx)):
Y=1的掃描線上沒有線段信息。
Y=2的掃描線上具有線段S5的信息(2,1,9.0)。
Y=3的掃描線上沒有線段信息。
Y=4的掃描線上沒有線段信息。
Y=5的掃描線上具有線段S1的信息(3,2,-0.33333333)。
Y=6的掃描線上沒有線段信息。
Y=7的掃描線上具有線段S3的信息(9,5,-0.5)和線段S4的信息(9,1,0.33333333)。
下面根據上面生成的邊表來計算每個掃描線與多邊形交點的x座標。以計算線段S1與掃描線的交點爲例來說明計算方法。線段S1在邊表中的信息是(3,2,-0.33333333),並且其處於Y=5的掃描線上,所以S1與5-2=3條掃描線具有交點,分別是Y=5、Y=4、Y=3這三條掃描線,Y=5掃描線上的交點x座標就是之前記錄下來的線段S1信息的Xs,即是3,Y=4掃描線上的交點x座標=3+xx=3-0.33333333=2.66666667,Y=3掃描線上的交點x座標=2.66666667+xx=2.66666667-0.33333333=2.33333334。將後二個交點插入到邊表的Y桶中(第一個交點已在Y桶中)。經過此次運算之後,邊表變成了如下格式(Y桶中的Node對象我們只列出Xs,以後的結果處理階段只需要Node類的Xs數據成員)。
Y=1 無
Y=2 2
Y=3 2.33333334
Y=4 2.66666667
Y=5 3
Y=6 無
Y=7 9 9
再次採用上述方法,求線段S3與掃描線的交點,並插入邊表的Y桶中,過程不在複述,結果如下:
Y=1 無
Y=2 2
Y=3 2.33333334
Y=4 2.66666667
Y=5 3
Y=6 8.5
Y=7 9 9
求線段S4與掃描線的交點,並插入邊表的Y桶中,結果如下
Y=1 無
Y=2 2 10.6666665
Y=3 2.33333334 10.33333332
Y=4 2.66666667 9.99999999
Y=5 3 9.66666666
Y=6 8.5 9.33333333
Y=7 9 9
線段S5只與一條掃描線相交,而這個交點已經存在於邊表中,故不在添加。至此交點計算完畢,下面進行柵格化工作,按照交點計算結果四捨五入之後,可以將該多邊形柵格化爲如圖3所示的效果。將這些柵格填充之後可以達到填充多邊形內部的目的。
凹多邊形也是如此處理,需要注意的是邊表中掃描線下可能具有n的交點(n必然是偶數),需要將1、2相連,3、4相連,依此類推。
具有內部環的多邊形處理的方式大致和本文提供的方法一樣,先根據多邊形的外框線生成包含交點信息的邊表,然後將所有內部環計算和掃描線的交點,並加入之前的邊表,讀者朋友可以自己試試。