2013-01-08 52 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中做到这一点? –