邊界標誌演算法對多邊形的每條邊進行掃瞄並對該畫素打上標誌。然後再利用掃瞄線掃瞄該多邊形,對於與多邊形相交的掃瞄線依從左到右的順序,逐個訪問該掃瞄線上的畫素。使用乙個布林值量inside來表示當前點是否在多邊形內。inside的初值為假,每當當前訪問的畫素是被打上邊標誌的點時,就把inside取反。對未標誌的畫素,inside不變。若訪問當前畫素時,inside為真,說明該畫素在多邊形內,則把該畫素置為填充色。
偽**如下:
void edgemark_fill(polydef,color) }
根據偽**在c++中實現:
void
cgraphicdlg::edgemarkfill(colorref
edgecolor, colorref
fillcolor, int
ymin, int
ymax, int
xmin, int
xmax)
if (inside)
drawrectange(j, i, 0, 0, fillcolor); }
}return
void(); }
效果圖如下:
可以發現明顯的「漏水」現象。
為什麼呢?我們將邊界放大觀察,請看大圖
可以看見圖中連續的標誌畫素點。如果其為偶數,就會導致inside在這一邊經歷兩次變換,如果在掃瞄到邊界前是填充,再變換兩次,還是填充,就導致了「漏水」現象。
為了解決這個問題
引入乙個布林值,flag,初始化為false
flag==true——即使當前點被標記為邊界色,也不能改變inside。如果當前點不是邊界,則改變flag為false
flag==false——當前點被標記為邊界色,則會改變inside。如果當前點不是邊界,則會改變inside,且flag變為true
改進後的**如下:
void
cgraphicdlg::edgemarkfill(colorref
edgecolor, colorref
fillcolor, int
ymin, int
ymax, int
xmin, int
xmax)
else
if (!res&&flag)
if (inside&&!res)
drawrectange(j, i, 0, 0, fillcolor); }
}return
void(); }
效果圖:
然而頂部密集的部分,還是漏了。至於這個問題,懇請高人指點啊。
最後放上兩張放大圖
寒江雪 區域填充演算法 掃瞄線
區域填充遞迴演算法已經領教過了。記憶體消耗大,時間效率低,經典的深搜思想。為了解決這個問題,於是有人提出了種子填充掃瞄線演算法。其實就是深搜不行,換寬搜 bfs 該演算法假設已知其中乙個畫素點,然後從這個畫素點出發,去尋找周圍可以著色的點。這個已知點,我們稱其為種子點。每一輪著色之後,記錄下著色的區...
邊界跟蹤演算法之內邊界跟蹤
如何獲取乙個目標的邊界資訊呢?首先要說的是,邊界跟蹤演算法是在區域已經分出 影象已經是二值圖或已經標註的圖 但邊界卻是未知的。如何獲取乙個目標的邊界資訊呢?我將自己學習經驗分享給大家。演算法描述如下 內邊界跟蹤 圖3 4鄰域查詢方向 圖4 8鄰域查詢方向 圖5描述圖5 假設綠色框為我們所要處理目標物...
寒江雪 凸多邊形矩形裁切演算法
最近都在準備著考試,沒有寫部落格,今天忙裡偷閒,寫點關於裁切演算法的文字。這次要幹的事情是給定乙個凸多邊形的點描述和矩形的點描述,按著矩形來對多邊形區域進行裁切。大概如下圖所示 藍色矩形是裁剪框,相當於photoshop裡的選區,紅色多邊形是影象,裁剪後在紅色以外的部分被剪掉,相交邊用橙色線條表示。...