代码之家  ›  专栏  ›  技术社区  ›  Calimera

整体填充Java(在画布中填充一个圆)

  •  0
  • Calimera  · 技术社区  · 7 年前

    我试图填充一个圆,我在画布上用泛光填充法做了一些点。只有圆应该被填充,外面什么都不应该被填充。所以我制作了一个列表,其中存储了画布上已经标记的所有点。

     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.StackOverflowerr位于 太阳java2d。SunGraphics2D。圆角(未知源)

    在这一点上我做错了什么?或者换句话说: 我走对了吗? 我以前从未犯过这个错误,现在我真的很困惑。我这样做对吗?任何提示都会很有帮助,甚至不需要是代码解决方案!:/

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

     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 回复  |  直到 7 年前
        1
  •  3
  •   jbarat    7 年前

    你不需要检查边缘。 filledpoints 将包含点状 Point(-1, 0) . 然后 fillOval 无法绘制它并引发异常。