通過實踐,我們不難發現,基礎的種子填充演算法根本沒法使用。常常遇到的問題是:stack overflow (棧溢位)。
一種可行的解決辦法是通過自己構建資料結構棧來將遞迴演算法改非遞迴演算法,但是實踐的執行結果還是極其緩慢。
現在通過使用集合來優化這個演算法,雖然效率仍然不理想,但還是有一定現實意義:給學習圖形學的學生們乙個練習的機會。
下面,我將使用四連通區域的種子填充演算法進行展現。核心**如下:
void fillarea(int x, int y)
//後繼
colorref colort = getpixel(node.x, node.y - 1);
colorref colorb = getpixel(node.x, node.y + 1);
colorref colorl = getpixel(node.x - 1, node.y);
colorref colorr = getpixel(node.x + 1, node.y);
point t = point(node.x, node.y - 1);
point b = point(node.x, node.y + 1);
point l = point(node.x - 1, node.y);
point r = point(node.x + 1, node.y);
if (colort !=paintcolor && colort == color && myset.find(t) == myset.end())
if (colorb != paintcolor && colorb == color && myset.find(b) == myset.end())
if (colorl != paintcolor && colorl == color && myset.find(l) == myset.end())
if (colorr != paintcolor && colorr == color && myset.find(r) == myset.end())
//消已
putpixel(node.x, node.y, getfillcolor());
myset.erase(node);
}}
其中,點類(point)是我自己寫的乙個類。由於集合的內容不能重複,因素必須過載<
運算子才能使用。
struct point
bool operator < (const point& point) const
else if(x > point.x)
else
else
}return flag;
}};
下面的執行結果,效果還是不錯的。只是在填充較大面積區域時仍然十分緩慢。
種子填充演算法
在多邊形區域內部填充某元素。種子演算法,即從內部某一點開始填充,再遞迴填充周圍的點 上下左右 四連通 直到遇到邊界。void tianchong int x,int y,int color 在實際應用中,出現了遞迴呼叫棧溢位的情況,先在這裡留坑,下次再補上具體的資料吧。基礎演算法在實際應用中,除了上...
基於佇列和雜湊的種子填充演算法
繼 之後,我又對種子填充演算法進行了改進,主要利用了雜湊的思想,以空間換時間,把這個演算法的速度再次優化了。這次的優化效果非常好,填充大面積區域稍有卡頓。下面是效果圖 核心 如下 雖然看起來很多,但是相同的內容很多,邏輯清晰。void fillarea int x,int y 雜湊表,雜湊函式 h ...
種子填充演算法(Uva 572
題目描述 給定乙個m n的矩陣,由 和 組成。求 一共有幾塊是連通的。思路 使用dfs遍歷,即找到乙個 後,將與之在同一塊的 均標記,之後碰到就可以忽略。然後遍歷一遍矩陣即可。如下 include include include define clean i memset i,0,sizeof i ...