在計算機圖形學中,多邊形有兩種重要的表示方法:頂點表示和點陣表示。頂點表示是用多邊形的頂點序列來表示多邊形。這種表示直觀、幾何意義強、佔記憶體少,易於進行幾何變換,但由於它沒有明確指出哪些象素在多邊形內,故不能直接用於面著色;點陣表示是用位於多邊形內的象素集合來刻畫多邊形。這種表示丟失了許多幾何資訊,但便於幀緩衝器表示圖形,是面著色所需要的圖形表示形式。光柵圖形的乙個基本問題是把多邊形的頂點表示轉換為點陣表示,這種轉換稱為多邊形的掃瞄轉換。
區域填充則是指先將在點陣表示的多邊形區域內的一點(稱為種子點)賦予指定的顏色和灰度,然後將這種顏色和灰度擴充套件到整個區域內的過程。
(1)多邊形的掃瞄轉換
多邊形掃瞄轉換演算法對多邊形的形狀沒有限制,但多邊形的邊界必須是封閉的,且不自交。我們可以將多邊形分為三種:凸多邊形、凹多邊形、含內環的多邊形。
圖2.3.1 多邊形的種類
(a)掃瞄線演算法
掃瞄線演算法是按掃瞄線順序,計算掃瞄線與多邊形的相交區間,再用要求的顏色顯示這些區間的象素,完成轉換工作。區間的端點可以通過計算掃瞄線與多邊形邊界線的交點獲得。對於一條掃瞄線,多邊形的掃瞄轉換過程可以分為四個步驟:
圖2.3.2 乙個多邊形與若干掃瞄線
為了提高效率,在處理一條掃瞄線時,僅對與它相交的多邊形的邊進行求交運算。我們把與當前掃瞄線相交的邊稱為活性邊,並把它們按與掃瞄線交點x座標遞增的順序存放在乙個鍊錶中,稱此鍊錶為活性邊表(aet)。
dx;第3項存該邊所交的最高掃瞄線號
ymax
。a. 掃瞄線6的活性邊表
b. 掃瞄線7的活性邊表
圖2.3.3活性邊表(aet)
假定當前掃瞄線與多邊形某一條邊的交點的橫座標為x,則下一條掃瞄線與該邊的交點不必要重計算,只要加乙個增量△x即可,下面,我們推導這個結論。
,yi)、(xi+
1,yi+
1),則:
axi+byi+c=0
axi+
1+byi+
1+c=0
其中△x=-b/a 為常數,
為了方便活性邊表的建立與更新,我們為每一條掃瞄線建立乙個新邊表(net),存放在該掃瞄線第一次出現的邊。也就是說,若某邊的較低端點為ymin
,則該邊就放在掃瞄線ymin
的新邊表中。
圖2.3.4 上圖所示各條掃瞄線的新邊表net
演算法過程:
void polyfill (polygon, color)
int color;多邊形 polygon;
y = 最低掃瞄線號;
初始化活性邊表aet為空;
for (各條掃瞄線i )
} /* polyfill */
掃瞄線與多邊形頂點相交時,必須正確地取捨交點,如圖2.3.5所示。
圖2.3.5 掃瞄線與多邊形相交,特殊情況的處理
? 掃瞄線與多邊形相交的邊分別位於掃瞄線的兩側,則計乙個交點,如點p
5,p6
。?
掃瞄線與多邊形相交的邊分別位於掃瞄線同側,且 yi
-1,yi
+1,則計2個交點(填色),如p
2。若 yi
>yi
-1,yi
>yi
+1,則計0個交點(不填色),如p1。
?
掃瞄線與多邊形邊界重合 (當要區分邊界和邊界內區域時需特殊處理),則計1個交點。
具體實現時,只需檢查頂點的兩條邊的另外兩個端點的y值。按這兩個y值中大於交點y值的個數是0,1,2來決定。
(b)邊界標誌演算法
邊界標誌演算法的基本思想是:在幀緩衝器中對多邊形的每條邊進行直線掃瞄轉換,亦即對多邊形邊界所經過的象素打上標誌。然後再採用和掃瞄線演算法類似的方法將位於多邊形內的各個區段著上所需顏色。對每條與多邊形相交的掃瞄線依從左到右的順序,逐個訪問該掃瞄線上的象素。使用乙個布林量
inside來指示當前點是否在多邊形內的狀態。inside的初值為假,每當當前訪問的象素為被打上邊標誌的點,就把inside取反。對未打標誌的象素,inside不變。若訪問當前象素時,inside為真,說明該象素在多邊形內,則把該象素置為填充顏色。
邊界標誌演算法:
void edgemark_fill(polydef, color)
多邊形定義 polydef; int color;
}
用軟體實現時,掃瞄線演算法與邊界標誌演算法的執行速度幾乎相同,但由於邊界標誌演算法不必建立維護邊表以及對它進行排序,所以邊界標誌演算法更適合硬體實現,這時它的執行速度比有序邊表演算法快一至兩個數量級。
(2)區域填充演算法
這裡討論的區域指已經表示成點陣形式的填充圖形,它是象素的集合。區域可採用內點表示和邊界表示兩種表示形式。
內點表示:區域內的所有象素著同一顏色。
邊界表示:區域的邊界點著同一顏色。區域填充指先將區域的一點賦予指定的顏色,然後將該顏色擴充套件到整個區域的過程。
區域填充演算法要求區域是連通的,因為只有在連通區域中,才可能將種子點的顏色擴充套件到區域內的其它點。區域可分為4向連通區域和8向連通區域。4向連通區域指的是從區域上一點出發,可通過四個方向,即上、下、左、右移動的組合,在不越出區域的前提下,到達區域內的任意象素;8向連通區域指的是從區域內每一象素出發,可通過八個方向,即上、下、左、右、左上、右上、左下、右下這八個方向的移動的組合來到達。
圖2.3.7 四連通區域和八連通區域
圖2.3.8 區域的內點表示和邊界表示
(a)區域填充的遞迴演算法
以上討論的多邊形填充演算法是按掃瞄線順序進行的。種子填充演算法假設在多邊形內有一象素已知,由此出發利用連通性找到區域內的所有象素。
設(x,y)為內點表示的4連通區域內的一點,oldcolor為區域的原色,要將整個區域填充為新的顏色newcolor。
內點表示的
4連通區域的遞迴填充演算法:
void floodfill4(int x,int y,int oldcolor,int newcolor) }
邊界表示的4連通區域的遞迴填充演算法:
void boundaryfill4(int x,int y,int boundarycolor,int newcolor) }
對於內點表示和邊界表示的8連通區域的填充,只要將上述相應**中遞迴填充相鄰的4個象素增加到遞迴填充8個象素即可。
OpenGL 多邊形的掃瞄轉換
一 理論 求交 計算掃瞄線與多邊形各邊的交點 排序 把所有交點按遞增順序進行排序 交點配對 第乙個與第二個,第三個與第四個 保證交點的個數為偶數個 區間填色 把這些相交區間內的畫素置成不同與背景色的填充色 在填充過程中應該考慮兩個問題 一是當掃瞄線與多邊形頂點相交時,交點的取捨問題。二是多邊形邊界上...
多邊形掃瞄轉換演算法
1.多邊形的頂點表示轉換為多邊形的點陣表示 1 頂點表示 用多邊形的頂點的序列來描述多邊形,幾何意義強 佔記憶體少。2 點陣表示 用位於多邊形內的畫素的集合來描述多邊形。3 轉換基本思想 按掃瞄線順序,計算掃瞄線與多邊形的相交區間,再用要求的顏色顯示這些區間的所有象素 2.x掃瞄線演算法的演算法步驟...
掃瞄多邊形填充演算法
掃瞄多邊形填充演算法 在做手機地圖的過程中,由於j2me沒提供多邊形填充的api,只能自己實現了,以下是實現的思路,請批評指正 多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素...