2013-01-08 51 views
1

我目前正在爲練習創建一個小油漆程序。現在我正在嘗試做油漆桶工具,或者換句話說就是填充水。有趣的是:如果需要填充的像素數量很少,一切正常。如果填充像素的仇恨數量較高,它會給我一個SO-Exception。這裏是我的代碼:StackOverflow在我的洪水填充

private void FloodFill(Bitmap picture, int x, int y) 
{ 
    if (x <= 0 || y <= 0 || x >= DrawingPanel.Width || y >= DrawingPanel.Height) 
    { 
    return; 
    } 

    if (picture.GetPixel(x, y) != löschFarbe) 
    { 
    return; 
    } 

    if (picture.GetPixel(x, y) == löschFarbe) 
    { 
    picture.SetPixel(x, y, ColorButton.BackColor); 
    } 

    FloodFill(picture, x + 1, y); 
    FloodFill(picture, x, y + 1); 
    FloodFill(picture, x - 1, y); 
    FloodFill(picture, x, y - 1); 
    FloodFill(picture, x + 1, y + 1); 
    FloodFill(picture, x - 1, y + 1); 
    FloodFill(picture, x + 1, y - 1); 
    FloodFill(picture, x - 1, y - 1); 
} 

「löschFarbe」是被點擊的顏色(這將被刪除/覆蓋另一種顏色)

錯誤發生:如果我要填寫完整的圖片或大空間,我在這裏得到一個錯誤:

if (picture.GetPixel(x, y) != löschFarbe) 
    { 
    return; 
    } 

任何人都知道我可以解決這個問題嗎?

順便說一句,這是我的節目的圖象: Paint

+1

由於'FloodFill'自己調用了太多次,你會得到堆棧溢出異常。考慮圖像中有多少像素,然後考慮點擊圖像中心時調用FloodFill的次數。它調用'FloodFill',然後在第一個相鄰像素上調用'FloodFill',並且這個像素一樣,一遍又一遍。 – dreamlax

+0

由於'GetPixel'方法沒有足夠的堆棧空間才能正常工作,因此您在其他地方發生錯誤。你需要重新思考如何使用循環而不是遞歸進行洪泛填充。 – dreamlax

+0

Geez 8點指數,1 - 8 - 64 -512 - 4096 - 32768,難怪你有堆棧溢出!多數民衆贊成深入6 0.o – RhysW

回答

2

即使是一箇中等規模的floodfill會打擊你的調用堆棧。

嘗試將此基於遞歸的方法轉換爲基於堆棧的方法,如this question

+0

如何在MATLAB中做到這一點? –