多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素,則賦予指定的顏色值,多邊形外的象素,則不賦予指定的顏色值,具體該如何判斷象素是否在多邊形內呢?這裡我們採用」掃瞄線多邊形填充演算法」。
掃瞄多邊形填充演算法的基本原理——在直角座標系中,假設有一條從左至右的掃瞄線穿過多邊形,從左至右開始計數,與多邊形交點為奇數時,開始進入多邊形,與多邊形交點為偶數時,走出多邊形。這樣在這相鄰配對的奇偶交點間的所有象素都在多邊形內。如圖,奇數交點a,c,都是進入多邊形,偶數交點b,d都是走出多邊形,相鄰的奇偶交點配對,a,b之間,c,d之間的象素都在多邊形內,可見一條掃瞄線上,與多邊形交點個數需要為偶數。依據這樣的思路,掃瞄線從上到下,從左到右依次掃過多邊形即可求得多邊形所佔據的象素。(注意退化情況的處理,也就是掃瞄線剛好經過頂點或者多邊形的邊本身就是水平的情況)
具體實現——首先,求多邊形最上,最下的行號,以便於確定掃瞄線的行數,這個可以根據多邊形的mbr求得;其次,確定一條掃瞄線上,與多邊形的交點,保證交點個數為偶數,並對這些交點按列號從小到大排列;最後,掃瞄轉換,掃瞄線從上到下,每條掃瞄線從左到右,對這些排序好的奇偶點配對連線。所採用的資料結構類似於「鋸齒狀的二維陣列」,第一維代表行號,第二維代表一行中的交點。為了實現以上的步驟,需要對多邊形邊界進行柵格化,確定邊界所經過的柵格,並把這些儲存為「鋸齒狀的二維陣列」(柵格化方法有:數值微分法,bresenham演算法,柵格中心線求交法)。退化情況的處理:
一、邊線端點的處理。比較此端點與它相鄰的前後兩端點所在掃瞄線的行號,設此端點的行號為h0,前一端點的行號為h1,後一端點的行號為h2。
1)h0>h1 and h0>h2,如圖,點a、c、f,這些端點的柵格點不予以記錄,即掃瞄線經過該點,計交點為0。
2)h03)h0h2 or h0>h1 and h0二、水平線的處理。多邊形邊線段,掃瞄出來為一橫線,即一條線段從頭到尾都佔據一行柵格。理論上,這種情況與掃瞄線有無數個交點,為了保持一行中交點個數為偶數,判斷當前橫線段與前後相鄰兩條線段的位置關係,同時先柵格化此橫線,作以下規定。
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,一直遞迴下去,直到確定判斷條件。如果覺得這種情況比較麻煩,在程式端點迴圈的時候,找到第一段不是橫線的起點開始迴圈,這樣,只要判斷,橫線後麵條線段的情況,直到確定判斷條件即可。
掃瞄多邊形填充演算法
掃瞄多邊形填充演算法 在做手機地圖的過程中,由於j2me沒提供多邊形填充的api,只能自己實現了,以下是實現的思路,請批評指正 多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素...
掃瞄多邊形填充演算法
多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素,則賦予指定的顏色值,多邊形外的象素,則不賦予指定的顏色值,具體該如何判斷象素是否在多邊形內呢?這裡我們採用 掃瞄線多邊形填充演...
多邊形區域填充演算法 掃瞄線種子填充演算法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!1.3掃瞄線種子填充演算法 1.1和1.2節介紹的兩種種子填充演算法的優點是非常簡單,缺點是使用了遞迴演算法,這不但需要大量棧空間來儲存相鄰的點,而且效率不高。為了減少演算法中的遞迴呼叫,節省棧空間的使用,人們提出了很多改進演算法,其中一種就是掃瞄...