C# 我的洪水泛滥
我目前正在创建一个用于练习的小绘画程序。现在我正在尝试做油漆桶工具,或者换句话说,一个洪水填充。有趣的是:如果必须填充的像素数很小,那么一切都正常。若要填充的像素数更高,那个么我就有一个例外。这是我的密码:C# 我的洪水泛滥,c#,stack-overflow,flood-fill,C#,Stack Overflow,Flood Fill,我目前正在创建一个用于练习的小绘画程序。现在我正在尝试做油漆桶工具,或者换句话说,一个洪水填充。有趣的是:如果必须填充的像素数很小,那么一切都正常。若要填充的像素数更高,那个么我就有一个例外。这是我的密码: private void FloodFill(Bitmap picture, int x, int y) { if (x <= 0 || y <= 0 || x >= DrawingPanel.Width || y >= DrawingPanel.Height)
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);
}
有人知道我怎么解决这个问题吗
顺便说一句,这是我节目的图片:
即使是中等大小的洪水也会吹坏你的呼叫堆栈
尝试将此基于递归的方法转换为基于堆栈的方法,如中所示。由于
FloodFill
调用自身的次数过多,因此出现堆栈溢出异常。考虑你的图像中有多少像素,然后考虑当你点击图像的中心时会调用多少次<代码> FloodFill <代码>。它调用FloodFill
,然后在第一个相邻像素上调用FloodFill
,而该像素会一次又一次地执行相同的操作。由于GetPixel
方法没有足够的堆栈空间来正常工作,因此在其他地方会出现错误。你需要重新思考如何使用循环而不是递归进行洪水填充。天啊,8点指数,1-8-64-512-4096-32768,难怪你会出现堆栈溢出!那只是到了60度的深度
if (picture.GetPixel(x, y) != löschFarbe)
{
return;
}