Flood Fill算法导致StackOverFlowError

时间:2014-02-18 19:57:30

标签: java algorithm recursion flood-fill

我正在使用Java编写一个简单的绘图应用程序。我正在尝试使用Flood Fill算法的递归实现作为我的“桶填充”工具。

但是,总是给了我一个StackOverFlowError。 (无论我使用'桶填充工具'的区域有多小)。

编辑:更改了代码以提高效率。仍然是同样的错误。

以下是代码:

public void floodFill(int x, int y, Color targetColor, Color replacementColor) throws AWTException{

    pixelColor = robot.getPixelColor(x,y);

    g.setColor(replacementColor);
    g.fillRect(x, y, 1, 1);

    if(robot.getPixelColor(x-1, y).equals(targetColor))
        floodFill(x-1, y, targetColor, replacementColor);

    if(robot.getPixelColor(x+1, y).equals(targetColor))
        floodFill(x+1, y, targetColor, replacementColor);

    if(robot.getPixelColor(x, y-1).equals(targetColor))
        floodFill(x, y-1, targetColor, replacementColor);

    if(robot.getPixelColor(x, y+1).equals(targetColor))
        floodFill(x, y+1, targetColor, replacementColor);

}

我想知道这个算法是否有仍然使用递归的方法,并且不会出现此错误。

如果不是,该算法有哪些非递归实现可以在我的程序中使用?

3 个答案:

答案 0 :(得分:1)

您还必须检查已设置的目标颜色,否则会反复覆盖相同的目标颜色。

答案 1 :(得分:1)

只需检查功能的开头当前位置,即它的颜色。

如果它已经有replacementColor你已经访问过这一点并且可以返回。

public void floodFill(int x, int y, Color targetColor, Color replacementColor) throws AWTException{
{
  if(robot.getPixelColor(x, y).equals(replacementColor))
    return;
...
}

答案 2 :(得分:0)

实现铲斗填充的更好方法是确定哪个图形或区域包含鼠标点击位置。 (例如)如果您在圆圈内单击(没有其他对象),则需要填充圆圈。因此,如果您维护某种区域地图,您可以快速找出鼠标点击位置在哪个区域,并使用现有方法(来自某些标准Java或外部软件)填充该区域,以填充具有颜色的区域。