矢量數據柵格化——多邊形填充(二)

 

李泉 陳玉進(南京跬步科技有限公司http://www.creable.cn

舉例說明如下:如圖2,根據多邊形的座標信息,生成一個算法需要的表結構。生成此表的原則是:以多邊形相鄰兩點組成的線段爲單位,以與該線段相交的y座標最大的掃描線爲依據(其中僅僅有一條線與該線段相交的情況出現時,該線段的相關信息不記錄到表中),將相關信息存儲到表的Y桶中。例如:與線段S1相交的掃描線的y最大值爲5,故S1的相關信息應該寫入Y=5的掃描線中(Y桶中包含若干個掃描線)。

       依照上述規則生成的表格如下(線段的信息就是前面設計的Node對象,其格式爲(XsYminxx)):

Y=1的掃描線上沒有線段信息。

Y=2的掃描線上具有線段S5的信息(219.0)。

Y=3的掃描線上沒有線段信息。

Y=4的掃描線上沒有線段信息。

Y=5的掃描線上具有線段S1的信息(32-0.33333333)。

Y=6的掃描線上沒有線段信息。

Y=7的掃描線上具有線段S3的信息(95-0.5)和線段S4的信息(910.33333333)。

       下面根據上面生成的邊表來計算每個掃描線與多邊形交點的x座標。以計算線段S1與掃描線的交點爲例來說明計算方法。線段S1在邊表中的信息是(32-0.33333333),並且其處於Y=5的掃描線上,所以S1523條掃描線具有交點,分別是Y=5Y=4Y=3這三條掃描線,Y=5掃描線上的交點x座標就是之前記錄下來的線段S1信息的Xs,即是3Y=4掃描線上的交點x座標=3xx30.333333332.66666667Y=3掃描線上的交點x座標=2.66666667xx2.666666670.333333332.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必然是偶數),需要將12相連,34相連,依此類推。

具有內部環的多邊形處理的方式大致和本文提供的方法一樣,先根據多邊形的外框線生成包含交點信息的邊表,然後將所有內部環計算和掃描線的交點,並加入之前的邊表,讀者朋友可以自己試試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章