FloodFill StackOverFlow,IDEA

时间:2017-11-09 00:02:11

标签: java intellij-idea stack-overflow flood-fill

我正在尝试编写洪水填充,但是递归有任何问题。错误消息msg说:“线程中的异常”AWT-EventQueue-0“java.lang.StackOverflowError

这是我的代码:

public class FillerSeedFill<PixelType> {
    public RasterImage<PixelType> filler (RasterImage<PixelType> img,
                                          int x, int y,
                                          PixelType newPixel,
                                          PixelType borderPixel,
                                          PixelType currentPixel
                                          ){

        RasterImage<PixelType> result = img;
        if ( borderPixel != currentPixel){
            if(currentPixel!=newPixel) {

                result = result.withPixel(x, y, newPixel);

                filler(img,x+1,y,newPixel,borderPixel,currentPixel);
                filler(img,x-1,y,newPixel,borderPixel,currentPixel);
                filler(img,x,y+1,newPixel,borderPixel,currentPixel);
                filler(img,x,y-1,newPixel,borderPixel,currentPixel);

                return result;
            }
        }
        return result;
    }
}

并在画布中:

if(jComboBoxSelectColoring.getSelectedIndex()==0){
   System.out.println("Seed fill");
   int currentPixel = 0x2f2f2f;
   System.out.println(currentPixel);
   fillerSeedFill.filler(rasterImage,
        previousX,previousY,
        0xC4D4AF,
        0x8AC249,
        currentPixel);
   System.out.println(previousX+" "+previousY);
   panel.repaint();
}

在IDEA中有没有改变XSS的可能性?我在Eclipse中记得就像它一样。( - XSS100M)

currentPixel是canva背景的collor(0x2f2f2f)。

修改 在previousX中,Y是来自侦听器的游标的int位置。

编辑已解决: 问题是当前像素没有采用实际的颜色值。它有const。 0x2f2f2f因此比较是无关紧要的。 :) ..谢谢大家

2 个答案:

答案 0 :(得分:0)

要设置arg Xss,在intelliJ中,您可以执行以下操作: 定义运行/调试配置的配置选项

  1. 单击“编辑运行/调试配置”对话框的“配置”选项卡。
  2. 在Main类字段中,指定包含main()方法的类。为此,请手动键入完全限定名称,或单击省略号按钮并从“选择主类”对话框中选择所需的类。 在“选择主类”对话框中,可以使用以下方法之一找到所需的类:
  3. 单击“项目”选项卡,然后从项目树视图中选择带有main()方法的类。
  4. 单击“按名称搜索”选项卡,然后开始键入类名。在您键入时,可用类列表会缩小以匹配您的条目。 单击“确定”,或在准备好后按Enter键。
  5. 在VM选项字段中,键入可选的VM参数,例如堆大小,垃圾收集选项,文件编码等。如果VM参数行太长,请单击/help/img/idea/2017.2/editorIcon .gif并在编辑器对话框中键入文本。
  6. 在“程序参数”字段中,键入应通过其参数数组传递给main()方法的可选参数列表。
  7. 在“工作目录”字段中,指定应用程序在运行时将使用的当前目录。
  8. 在Use classpath和SDK of module字段中,从项目中现有的模块列表中选择所需的模块。
  9. 来源: https://www.jetbrains.com/help/idea/setting-configuration-options.html

答案 1 :(得分:0)

增加堆栈大小可能不够,除非是非常小的图像,因此您可能希望改为迭代算法。一个简单的选择是让Deque进入你的坐标,然后将它们拉出来,类似下面的伪代码:

Deque<Point> queue = new ArrayDeque<>();
queue.add(new Point(x, y));
while (!queue.isEmpty()) {
    Point pt = queue.poll();
    // then do the same thing you were already doing, except use pt.x and pt.y,
    // and add new points to the queue instead of recursive calling 
}