掃瞄多邊形填充演算法

2021-05-06 16:15:30 字數 2225 閱讀 3723

掃瞄多邊形填充演算法

在做手機地圖的過程中,由於j2me沒提供多邊形填充的api,只能自己實現了,以下是實現的思路,請批評指正!

多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素,則賦予指定的顏色值,多邊形外的象素,則不賦予指定的顏色值,具體該如何判斷象素是否在多邊形內呢?這裡我們採用

」掃瞄線多邊形填充演算法」。

掃瞄多邊形填充演算法的基本原理——在直角座標系中,假設有一條從左至右的掃瞄線穿過多邊形,從左至右開始計數,與多邊形交點為奇數時,開始進入多邊形,與多邊形交點為偶數時,走出多邊形。這樣在這相鄰配對的奇偶交點間的所有象素都在多邊形內。如圖,奇數交點a,

c,都是進入多邊形,偶數交點b,

d都是走出多邊形,相鄰的奇偶交點配對,a,

b之間,c,

d之間的象素都在多邊形內,可見一條掃瞄線上,與多邊形交點個數需要為偶數。依據這樣的思路,掃瞄線從上到下,從左到右依次掃過多邊形即可求得多邊形所佔據的象素。(注意退化情況的處理,也就是掃瞄線剛好經過頂點或者多邊形的邊本身就是水平的情況)

具體實現——首先,求多邊形最上,最下的行號,以便於確定掃瞄線的行數,這個可以根據多邊形的

mbr求得;其次,確定一條掃瞄線上,與多邊形的交點,保證交點個數為偶數,並對這些交點按列號從小到大排列;最後,掃瞄轉換,掃瞄線從上到下,每條掃瞄線從左到右,對這些排序好的奇偶點配對連線。所採用的資料結構類似於「鋸齒狀的二維陣列」,第一維代表行號,第二維代表一行中的交點。為了實現以上的步驟,需要對多邊形邊界進行柵格化,確定邊界所經過的柵格,並把這些儲存為「鋸齒狀的二維陣列」(柵格化方法有:數值微分法,

bresenham

演算法,柵格中心線求交法)。退化情況的處理:

一、邊線端點的處理。比較此端點與它相鄰的前後兩端點所在掃瞄線的行號,設此端點的行號為

h0,前一端點的行號為

h1,後一端點的行號為h2。

1)h0>h1 and h0>h2

,如圖,點a、

c、f,這些端點的柵格點不予以記錄,即掃瞄線經過該點,計交點為0。

2)h0,如圖,點b、

e、g,這些端點的柵格點記錄兩次,即掃瞄線經過該點,計交點為2。

3)h0h2 or h0>h1 and h0,如圖,點d,

h,這些端點的柵格點記錄一次,即掃瞄線經過該點,計交點為1。

二、水平線的處理。多邊形邊線段,掃瞄出來為一橫線,即一條線段從頭到尾都佔據一行柵格。理論上,這種情況與掃瞄線有無數個交點,為了保持一行中交點個數為偶數,判斷當前橫線段與前後相鄰兩條線段的位置關係,同時先柵格化此橫線,作以下規定。

1)前後相鄰兩線段位於此橫線段的異側,如圖,橫線段

ab,前後兩線段ai,

bc位於橫線段

ab的異側,則與此橫線段交點計為

1,記錄

a點或者

b點,均可。

2)前後相鄰兩線段位於此橫線段的同側,如圖,橫線段

gf,前後兩線段gh,

fe位於橫線段

gf的同側,則與此橫線段交點計為

0,不記錄任何交點。

這種判斷的思想是這樣的:基於動態的思想,橫線

ab,假設a和

b兩點相互靠近,最終成為一點,假設為

a『,根據端點處理的方法,

a』介於前後兩點i、

c之間,應計交點乙個,而對於橫線

gf,一樣的道理,

gf相互靠近最終成為一點,假設為

f『,根據端點處理的方法,

f』大於前後兩點e、

h,應計交點

0。這種判斷可以有效處理橫線,但又帶來乙個新的問題,如果相鄰前或者後兩線段也是同此橫線一樣,也是在這一行水平,這樣就要遞推到更前或者更後的線段,直到找出以上判斷的條件。

如圖,判斷線段

ab,需要找到前一條線段

aj,後一條線段

bc,由於bc與

ab都是水平的,需要找再下一條

cd,得到aj、

cd位於水平線的異側,則計交點為

1。判斷線段

gh,前後兩線段gf、

hi都是水平的,需要分別尋找更前,、更後的線段fe、

ij,一直遞迴下去,直到確定判斷條件。如果覺得這種情況比較麻煩,在程式端點迴圈的時候,找到第一段不是橫線的起點開始迴圈,這樣,只要判斷,橫線後麵條線段的情況,直到確定判斷條件即可。

三、島嶼情況。以上退化情況的處理同樣適合島嶼情況的處理,依然要對柵格按列從左往右排序,奇偶配對畫線即可。

掃瞄多邊形填充演算法

多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素,則賦予指定的顏色值,多邊形外的象素,則不賦予指定的顏色值,具體該如何判斷象素是否在多邊形內呢?這裡我們採用 掃瞄線多邊形填充演...

掃瞄多邊形填充演算法

多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素,則賦予指定的顏色值,多邊形外的象素,則不賦予指定的顏色值,具體該如何判斷象素是否在多邊形內呢?這裡我們採用 掃瞄線多邊形填充演...

多邊形區域填充演算法 掃瞄線種子填充演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!1.3掃瞄線種子填充演算法 1.1和1.2節介紹的兩種種子填充演算法的優點是非常簡單,缺點是使用了遞迴演算法,這不但需要大量棧空間來儲存相鄰的點,而且效率不高。為了減少演算法中的遞迴呼叫,節省棧空間的使用,人們提出了很多改進演算法,其中一種就是掃瞄...