我正在使用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);
}
我想知道这个算法是否有仍然使用递归的方法,并且不会出现此错误。
如果不是,该算法有哪些非递归实现可以在我的程序中使用?
答案 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或外部软件)填充该区域,以填充具有颜色的区域。