【計算機圖形學】多變形填充算法原理

首先對於如下的多邊形:

在這裏插入圖片描述

1.有效邊表填充算法

1.1.有效邊表填充算法分爲如下幾個步驟:
1.1.1.將多邊形所有的邊分別與掃描線1計算交點,得到交點集,與掃描線計算的邊沒有順序要求。
1.1.2.將點集按標x的大小遞增排序,得到有序點集。
1.1.3.將有序點集兩兩配對,得到對應的像素區間。
1.1.4.將像素區間內的像素填充顏色,至此第一條掃描線上處於多邊形內的的像素填充完畢。
1.1.5.掃描線標號加1,重複以上步驟,直至到最後一條掃描線。
如:對於掃描線3(y=3)與多邊形所有的邊計算交點,得到與P3P4交於點(4.5,3),與P3P2交於點(2.4,3),與P5P6交於點(8.8,3),與P5P4交於點(7,3)。
圓整處理得到點集(5,3)、(2,3)、(9,3)、(7,3)。
遞增排序得到有序點集(2,3)、(5,3)、(7,3)、(9,3)。
兩兩配對得到掃描線3上的填充像素區間[2,5]、[7,9]。
填充區間內的所有像素。
得到如圖所示的填充效果:
在這裏插入圖片描述
全部填充得到如下效果:
在這裏插入圖片描述
1.2.至此我們發現如下疑問:
1.2.1.像素填充的多邊形面積大於多邊形實際面積。
可能上圖不太明顯,我們舉一個明顯一點的例子,如下正方形:
在這裏插入圖片描述
我們填充後的效果爲:
在這裏插入圖片描述
而正方形的實際面積是4,在顯示器上一個像素爲一面積,正方形應該佔4個像素點,而實際卻佔了9個像素點,對於這種問題,有效邊表填充算法採用“左閉右開”,“下閉上開”的原則進行像素點的填充,按照此原則,正方形的填充效果如下:
在這裏插入圖片描述
1.2.1.對於點集(1,3)、(1,8)它們分別爲掃描線1與P3P2、P3P4、P5P4、P5P6的交點,而在實際計算中它們仍只是兩個點,如果處理不當,計算機可能會兩兩配對得到區間(3,8)而填充到錯誤的像素區間。
對於此問題,有效邊表填充算法採用分類連接點進行處理。
有效邊表填充算法將多邊形的各個連接點分爲三類連接點:
+普通連接點:
連接點所在的兩條邊分別處於其所在的掃描線的上方和下方,如P2點。
+局部最低點:
連接點所在的兩條邊都處於其所在的掃描線的上方,如P3、P5點。
+局部最高點:
連接點所在的兩條邊都處於其所在的掃描線的下方,如:P4、P1、P6點。
在填充開始前,有效邊填充算法先對多邊形所有的連接點進行分類,判斷其在點集中的數量。
有效邊填充算法採用如下原則對多邊形的連接點進行處理:
1.2.2.普通連接點的處理原則
以P2爲例,根據“下閉上開”原則,對於P3P2上的點P2不予填充,P2P1上的點P2需要填充,P2點只填充1次,顧在掃描線7的填充像素點集中P2點的個數記爲1,即可以不處理。
1.2.3.局部最低點的處理原則
以P3爲例,根據“下閉上開”原則,對於P3P2上的點P3需要填充,P3P4上的點P3也需要填充,P3填充2次,掃描線1的填充像素點集中,再添加一個P3點,使其中有兩個P3點,在像素點集中將P3點的個數記爲2,P5點進行同樣的處理,這樣當算法進行兩兩配對時,得到的像素區間爲[3,3]、[5,5],如此即可避免出現[3,8]的點集區間,解決此類情況的填充錯誤。
1.2.4.局部最高點的處理原則
以P1點爲例,根據“下閉上開”原則,對於P2P1上的P1點不予填充,P0P1上的P1點也不予填充,P1填充0次,掃描線12的像素填充點集中P1點的個數記爲0,即從點集中刪除P1點,這樣的處理符合多邊形整體的“下閉上開”原則。
至此,多邊形的有效邊表填充算法的填充原理已經完成。
但是,我們在填充多邊形之前還需要進行一項很重要的工作——根據多邊形計算其有效邊表,首先我們要了解什麼是有效邊。
+有效邊:多邊形與當前掃描線相交的邊稱爲有效邊,有效邊的引入可以有效的避免掃描邊與多邊形的所有的邊進行交點計算,提高算法的效率。
+有效邊表:有效邊按與掃描線交點x座標遞增順序存放的鏈表。
+有效邊表節點結構:
在這裏插入圖片描述
示例:掃描線1的有效邊表如下:
在這裏插入圖片描述
+桶表:有效邊表按掃描線自增順序存放的表,可以是鏈表,也可以是順序表。
+桶表的結構:
如:多邊形P0-P6的桶表爲:
在這裏插入圖片描述
有效邊表可以有效的減少計算量,提升多邊形的填充效率,如所有的掃描線中,計算機只需要計算掃描線1、掃描線7和掃描線8,且掃描線1只需和邊P2P3、P3P4、P4P5、P5P6計算交點,而無需與所有邊計算交點,有效邊填充算法是目前最有效的多邊形填充算法之一。
至此,多邊形的有效邊填充算法全部完成。

2.邊緣填充算法

2.1.算法原理:
先計算多邊形每條邊與掃描線的交點,然後將交點右側的所有像素顏色全部取補色。
2.2.補色的定義:
對於黑白圖像,白色的補色爲黑色,黑色補色爲白色,對於彩色圖像,前景色取補就是將前景色置爲背景色,背景色取補就是將背景聲置爲前景色。
示例:
在這裏插入圖片描述
邊緣填充算法的填充效率受到右側填充像素的數量影響,當多邊形靠近屏幕左側時,計算機將填充大量無用像素,大大降低的算法的性能,浪費了系統資源。
於是有人提出這樣的改進:首先在進行多邊形填充之前,先掃描一遍多邊形,得出多邊形的包圍盒,並在適當的位置加入一條柵欄。
包圍盒:包圍多邊形的最小矩形。
2.3.加入包圍盒和柵欄的邊緣填充算法原理:
每次填充前先判斷當前邊在柵欄的左側還是右側,若在左側,則取補邊以右,柵欄以左的像素;若在右側,則取補邊以右,柵欄以左的像素。
示例:
在這裏插入圖片描述
可以看出,加入包圍盒和柵欄的邊緣填充算法極大的減少了需要填充像素的數量,對填充效率的提升是顯著的。
觀察邊緣填充算法的兩幅圖,我們是可以察覺到的,邊緣填充算法,對多邊形的頂點與邊的填充不甚理想,邊緣填充算法沒有給定具體填充時,直線上的點是否包含在填充範圍內,筆者試過兩種情況的對比------填充時包含直線上的點和填充時不包含直線上的點,得出的結果,多邊形的頂點與邊的填充都不理想,但是,填充時包含直線上的點的填充方法的最總結果,使多邊形在整體上滿足“左閉右開”,“下閉上開”原則,顧才用此方法作圖。然而,邊緣填充算法的填充原理是沒有考慮邊界的,即多邊形的所有像素都填充爲一個顏色,無論多邊形內部還是多邊形的邊和頂點,在實際填充效果中,多邊形所有像素都填充爲一個顏色的填充方式,頂點和邊對整體的效果不大,即可以忽略,所以邊緣填充算法依舊是效率極高的填充算法之一。

3.種子填充算法

3.1.種子填充算法是區域填充算法中的一種,種子填充算法分爲:四鄰接點種子填充算法和八鄰接點種子填充算法。
在此之前,我們需要了解一些概念:
3.1.1.四鄰接點:
任易一個種子像素,其左右上下這四個像素成爲這個種子像素的四鄰接點。
在這裏插入圖片描述
3.1.2.八鄰接點:
任易一個種子像素,其左右上下及左上、右下、右上、左上這八個像素成爲這個種子像素的八鄰接點。
在這裏插入圖片描述
3.1.3.四連通域:
多邊形中能被四鄰接點遍歷填充的區域。
3.1.4.八連通域:
多邊形中能被八鄰接點遍歷填充的區域。
在這裏插入圖片描述
3.1.5.四連通邊界:
在這裏插入圖片描述
3.1.6.八連通邊界:
在這裏插入圖片描述
3.2.適用場景:
區域填充算法適用於多邊形的邊界與內部使用不同的填充色的場景。
3.3.多邊形邊界的顏色:
邊界的顏色由繪製多邊形時的畫筆確定。
3.4.多邊形內部的顏色填充步驟
3.4.1.在多邊形內部任易選擇一個像素作爲種子像素。
3.4.2.將種子像素入棧。
3.4.3.如果棧不爲空,則將棧頂元素出棧。
3.4.4.按填充色繪製出棧像素。
3.4.5.按四鄰接點(左、上、右、下)(或八鄰接點(左、左上、上、右上、右、右下、下、左下))順序搜索與出棧像素相鄰的4(或8)個像素,若該像素的顏色不是填充色並且也不是邊界色,則把該像素入棧,否則丟棄該像素。
不難想象,當多邊形的面積極大時,入棧的像素像素將是巨量,有的像素可能即是一個像素的鄰接點又是另一個像素的鄰接點,以致部分像素入棧多次,此情況下填充過程將大量佔用棧存儲空間,甚至過量佔用空間,致使棧空間不足,導致其他程序無空間可用,如此既不能完成填充,又會造成空間溢出,甚至系統崩潰,所以種子填充算法的缺點極爲嚴重。
3.5.改進------掃描種子填充算法
3.5.1.在多邊形內部選擇一個像素作爲種子像素。
3.5.2.將種子像素入棧。
3.5.3.若棧不爲空,則將棧頂元素出棧
3.5.4.沿出棧像素所在掃描線,對出棧像素左右像素依次填充,直至遇到邊界像素爲止。
3.5.5.記錄該區間的範圍,將最左端的像素記爲Xl,將最右端的像素記爲Xr。
3.5.6.檢查與當前掃描線相鄰的上下兩條掃描線中在區間[Xl,Xr]裏的有關像素是否全爲邊界像素或以填充像素,若存在非邊界且未填充的像素,則把區間最右端像素取作種子像素入棧。
掃描種子填充像素每次只將區間最右端的像素入棧,極大的減少了入棧像素,不僅減少了棧空間的佔用,還有效的提高了填充效率和填充速度。

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