掃描填充圖元生成
基本過程
遍歷所有的掃描線:
- 求交點,按照順時針(逆時針)確定和多邊形邊的交點位置
- 按橫座標排序
- 配對儲存
- 對交點座標取整並填充每對交點之間的像素點。
需要考慮兩種特殊情況,即當有邊端點通過掃描線時:
- 如果共享頂點的兩條邊在掃面線同側,則將其視爲兩個頂點。
- 否則,將下方端點下移一個像素/上方頂點上移一個像素
加速計算
爲了加速計算引入有序邊表和活化邊表兩個概念。
- 有序邊表(ET):爲每條掃描線建立一個桶,將下端點在其上的邊歸入對應桶中,同一桶中按照橫座標排序。
- 活化邊表(AET):即和當前掃描線相交的邊的交點鏈表,通過如下過程計算:
- 將當前掃描線以下的有序邊表合併後插入活化邊表。(下端點在掃描線下)
- 刪除其中的邊。(過濾上端點在掃面線下的邊)
- 根據直線斜率計算交點。
區域填充圖元生成
區域的表示
- 內點法:枚舉出給定區域內所有像素。
- 邊界表示:枚舉出給定區域所有邊界上像素。
連通性
常用連通性:
- 4連通:上下左右互相可達。()
- 8連通:以當前像素爲中心的九宮格中其餘八可達。()
- 16連通:在8聯通基礎上增加8個馬步距離可達,即1*2方格對角線。()
連通性的性質:
- 當前點和在連通鄰域中的點屬於同一區域
- 像素4連通的區域的邊界像素只需是8連通
- 像素8連通的區域的邊界像素必須是4連通,否則欠約束。
- 如下圖,如果中間區域爲8連通區域,則黃色點和青色點爲同一區域,紅色邊界失效。
內外部判定
奇偶規則:
從任何位置p到區域範圍以外遠距離畫一射線,並統計沿該射線與區域多邊形邊界的交點數目。
- 若該射線與區域多邊形邊界的交點數目爲奇數,則p是內部點
非零環繞數規則
將環繞數初始化爲零,再假想從待檢測點位置P畫一射線,P點沿射線方向移動時,計數每個方向上穿越射線的邊數(可通過方向向量乘法判斷)。
- 當多邊形邊從右到左穿越射線時,環繞數加1
- 當多邊形邊從左到右穿越射線時,環繞數減1
- 如果最終環繞數非零則爲區域內部點
填充算法
一般區域填充算法都是指定種子點後填充該種子點所在的區域。
- 遞歸填充:按照連通性,從種子點開始遞歸填充直到填滿。
- 掃描線填充:爲了減少棧深度,每次填充該點所在的掃描線,並將相鄰掃描線段起始像素座標入棧。