洪水填充Java(在画布中填充圆圈)

时间:2017-11-21 11:19:40

标签: java canvas flood-fill

我正在尝试填充一个圆圈,我使用填充方法在我的画布上用一些圆点制作。只有圆圈才能被填满,外面没有任何东西。所以我制作了一个列表,其中我存储了已在画布中标记的所有点。

 private LinkedList<Point> filledpoints = new LinkedList<Point>();

在填充方法中,我现在想要覆盖一个起点,然后我想知道是否可以在这里画一个点,或者那里是否有点。我当然用谷歌搜索洪水填充算法,并提出了类似的东西 - 我试图将算法与8个邻居一起使用:

 // checking if a dot can be drawn:
  if (!filledpoints.contains(new Point(startX, startY))) {
      drawDot(g,startX,startY,Color.ORANGE);
      filledpoints.add(new Point(startX,startY));
      floodfill(g, startX + 1, startY);
      floodfill(g, startX, startY + 1);
      floodfill(g, startX - 1, startY);
      floodfill(g, startX, startY - 1);
      floodfill(g, startX + 1, startY + 1);
      floodfill(g, startX - 1, startY + 1);
      floodfill(g, startX - 1, startY - 1);
      floodfill(g, startX + 1, startY - 1); 
  }  

或只有四个邻居:

 if (!filledpoints.contains(new Point(startX, startY))) {
      drawDot(g,startX,startY,Color.ORANGE);
      filledpoints.add(new Point(startX,startY));
      floodfill(g, startX + 1, startY);
      floodfill(g, startX, startY + 1);
      floodfill(g, startX - 1, startY);
      floodfill(g, startX, startY - 1);
  } 

我还尝试过将列表中的点存储到数组中,然后使用数组进行检查,但它没有帮助。 它总是在第一个递归调用行中给出这个错误:

  

线程“AWT-EventQueue-0”中的异常java.lang.StackOverflowError at   sun.java2d.SunGraphics2D.fillOval(未知来源)

此时我做错了什么?或者换句话说:我甚至走在正确的轨道上?我之前从未遇到过此错误,而且此时我真的很困惑。它甚至是我试图这样做的正确方法吗?任何提示都会有所帮助,甚至不需要是代码解决方案! :/

如果需要,我的绘制方法(调用它来执行程序)如下所示:

 public void paint(Graphics g) {
  // drawing the circle:
  for (Circle c : circles) {
     drawCircle(g, c.radius, c.centerX, c.centerY);
  }

  if (!startpoints.isEmpty()) {
      for (Point p : startpoints) {
          floodfill(g, p.x, p.y);
      }
  }

}    

Startpoints是我将第一个点存储在圆圈内的数组(如果有更优雅的方式,请善待并告诉我)。 如果您需要有关此问题的代码的任何其他信息,请与我们联系。如果需要,我会在几秒钟内编辑它!

1 个答案:

答案 0 :(得分:3)

你没有检查边缘。 public class NewRoot { [XmlElement("MSG", typeof(MSG))] [XmlElement("Mg", typeof(Mg))] public MSG Msg {get;set;} } public class Mg : MSG {} 将包含filledpoints之类的点。然后Point(-1, 0)无法绘制并抛出异常。