基本思想:
用水平掃描線從上到下(或從下到上)掃描由多條首尾相連的線段構成的多邊形,每根掃描線
與多邊形的某些邊產生一系列的交點。將這些交點按照x坐標排序,將排序后的點兩兩配對,作
為線段的兩個端點,以所填的顏色畫水平直線。
步驟
1.求交,計算掃描線與多邊形的交點。
2.交點排序,對第1步得到的交點按照x從小到大排序
3.顏色填充,對排序后的交點兩兩組成一個水平線段,以畫線段的方式進行顏色填充。
4.完成多邊形掃描,就結束算法,否則,繼續1
有效邊
多邊形與當前掃描線相交的邊成為有效邊(active edge)。在處理一條掃描線時僅對有效邊進行
求交運算,避免與多邊形所有邊求交,提高效率。
x | ymax | 1/k | next |
桶表與邊表
有效邊給出了掃描線與有效邊交點的計算方法,但沒有給出新邊出現的位置坐標。為了確定在
哪條掃描線上加入了新邊,就需要構造一個邊表(edge table ET),用以存放掃描線上多邊形各
條邊出現的信息。水平邊本身就是掃描線在建立邊表時可以不予考慮。
桶表與邊表的表示法
桶表是按照掃描線順序管理邊出現的一個數據結構。首先,構造一個縱向掃描線鏈表,鏈表的
長度為多邊形所占有的最大掃描線數,鏈表的每個節點稱為桶(bucket),對應多邊形覆蓋的每一
條掃描線。
將每條邊的信息鏈加入該邊最小y坐標對應的桶處。
對每一條掃描線,如果新增多條邊,按照x|ymin 坐標遞增的順序存放在一個鏈表中,若x|ymin 相等,
則按照1/k遞增,就形成邊表。
x|ymin | ymax | 1/k | next |