掃瞄線法填充多邊形

2021-07-06 01:06:31 字數 1597 閱讀 2457

如下圖所示多邊形:

直線y=1,2,3……8順序掃瞄多邊形,以直線y=3為例,它與多邊形的邊有4個交點,將這4個交點的x座標儲存下來,兩兩之間畫線,也就是(a,b)(c,d)之間畫線。對於每乙個y都是兩兩之間畫線。現在考慮直線y=2,它與多邊形有3個交點,很顯然是f,g之間畫線,那麼p1怎麼處理呢?可以觀察到p1是多邊形邊的乙個端點,是兩條邊的交點,因此,可以選擇將p1看作兩個點儲存,這樣(p1,p1)之間畫線,就是描乙個點。或者不儲存p1,只在(f,g)之間畫線。我採用的是不儲存p1。

具體每一條掃瞄線對應的座標儲存在活性邊表aet中,每一條掃瞄線對應乙個鍊錶,鍊錶中的節點型別為xdx

ymax

next

其中,x為交點的x座標,dx為相交直線的x方向增量(x2-x1)/(y2-y1),ymax為直線可以到達的最大y值。由於我採用的是當掃瞄線與邊的端點相交時不儲存此交點,所以,掃瞄線y=1的aet中沒有儲存座標,y=2中不儲存p1,只儲存f,g的x座標以及f,g所在直線的斜率倒數。

新邊表net用來記錄y為多少時與新的邊相交,每一條掃瞄線也對應乙個鍊錶,結點型別和net中的結點型別相同。

如圖中的新邊表中,y=1應該記錄  (p2,p3),(p4,p3)兩條直線的資訊;y=2應該記錄(p1,p6),(p1,p2)兩條直線的資訊,y=6記錄(p4,p5)一條邊的資訊,y=7記錄(p6,p5)一條邊的資訊。

1、建立新邊表(對於斜率為0的直線不計入新邊表);

2、建立y=i對應的活性邊表:

檢查y=i對應的新邊表中是否有結點,若有,則將這些結點加入活性邊表 ;

檢查y=i-1對應的活性邊表,對於ymax=i的結點,忽略不計(也可以記錄,根據個人選擇) ,如果ymax

將y=i對應的活性邊表按照x遞增(或遞減)的順序排序。

3、依次掃瞄活性邊表,兩兩之間畫線。

對於上圖來說,新邊表如下:

y=111-2

4-->110

6y=2

21.5

4-->20

7 y=3  null

y=4  null

y=5  null

y=6 11

-38y=7 23

8y=8  null

活性邊表如下:

y=1  加入新邊表的結點 11

-24--〉1106

y=2  加入新邊表中的節點,y=1中的結點修改後加入(我這裡沒有排序,實際上應該排序的) 2

1.54

--〉207

--〉9-24

--〉1106

y=3    y=2對應的活性邊表中的結點修改後加入

3.51.54

--〉207

--〉7-24

--〉1106

y=4   2

07--〉1106

y=5 20

7--〉110

6y=6 2

07--〉11-38

y=7 23

8--〉8-3

8y=8   null

程式實現中涉及較多對鍊錶的操作,包括構建、排序,會寫在以下文章中。

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

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

掃瞄多邊形填充演算法

掃瞄多邊形填充演算法 在做手機地圖的過程中,由於j2me沒提供多邊形填充的api,只能自己實現了,以下是實現的思路,請批評指正 多邊形填充,就是把多邊形所佔據的柵格象素賦予指定的顏色值。要完成這個任務,乙個首要的問題就是求出多邊形所佔據的柵格象素,判斷乙個網格在多邊形內還是多邊形外,在多邊形內的象素...

掃瞄多邊形填充演算法

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