非递归Flood-Fill算法导致OutOfMemoryError

时间:2014-02-22 13:07:46

标签: java algorithm out-of-memory flood-fill

我正在写一个小型绘图应用程序。我正在尝试使用泛洪填充算法的非递归实现来创建“桶填充”工具。

但是,如果用户连续几次使用此工具且时间间隔太短,则会导致Java中出现OutOfMemoryError

我想知道如何优化我的实现,因此不会发生此错误。

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

    LinkedList<Point> stack = new LinkedList<Point>();

    stack.add(new Point(x,y)); // adding the point where the mouse was clicked.

    Point temp;
    while( !stack.isEmpty() ){

        temp = stack.pop();

        int pixelColorRGB = drawingArea.getRGB( (int)temp.getX(), (int)temp.getY() );
        Color pixelColor = new Color(pixelColorRGB, true);

        if(pixelColor.equals(targetColor)){

            g.setColor(replacementColor);
            g.fillRect((int)temp.getX(), (int)temp.getY(), 1, 1);

            if(this.contains((int) temp.getX() - 1, (int) temp.getY()))
                stack.add( new Point( (int) temp.getX() - 1, (int) temp.getY() ) );

            if(this.contains((int) temp.getX() + 1, (int) temp.getY()))
                stack.add( new Point( (int) temp.getX() + 1, (int) temp.getY() ) );

            if(this.contains((int) temp.getX(), (int) temp.getY() - 1))
                stack.add( new Point( (int) temp.getX(), (int) temp.getY() - 1 ) );

            if(this.contains((int) temp.getX(), (int) temp.getY() + 1))
                stack.add( new Point( (int) temp.getX(), (int) temp.getY() + 1 ) );

        }

    }

}

谢谢

1 个答案:

答案 0 :(得分:2)

编辑:根据korhner的评论(这是完全正确的)。 如果颜色与目标颜色不同,则仅添加到堆栈。

原帖: 将屏幕上的所有像素添加到堆栈应该没问题。 我认为问题可能是你有重叠点。

以类似于递归解决方案的方式,您必须知道堆栈中已经存在哪个点而不是再次添加它。

您可能需要使用其他数据结构。