整体填充Java(在画布中填充一个圆)
我正在尝试填充一个圆圈,我在画布上用泛光填充法画了一些点。只有圆圈应该被填满,外面什么都不能。因此,我制作了一个列表,其中存储了画布上已经标记的所有点整体填充Java(在画布中填充一个圆),java,canvas,flood-fill,Java,Canvas,Flood Fill,我正在尝试填充一个圆圈,我在画布上用泛光填充法画了一些点。只有圆圈应该被填满,外面什么都不能。因此,我制作了一个列表,其中存储了画布上已经标记的所有点 private LinkedList<Point> filledpoints = new LinkedList<Point>(); 或者只有四个邻居: // checking if a dot can be drawn: if (!filledpoints.contains(new Point(startX, s
private LinkedList<Point> filledpoints = new LinkedList<Point>();
或者只有四个邻居:
// 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.StackOverflower中的异常位于
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)
的点。然后,fillOval
无法绘制它并抛出异常。您不检查边<代码>填充点将包含类似点(-1,0)
的点。然后,Fillova
无法绘制它并抛出异常。好的,这完全有道理。但是我怎么能做到呢?通过for循环或类似的方法检查邻居?您可以像这样扩展if语句if(!filledpoints.contains(point))&&valid(point,width,height)),在valid方法中,您可以执行如下操作:return point.x>=0&&point.y>=0&&point.xOkay这完全有意义。但是我怎么能做到呢?通过for循环或类似的方法检查相邻对象?您可以像这样扩展if语句if(!filledpoints.contains(point))&&valid(point,width,height))
,并在valid方法中执行以下操作:return point.x>=0&&point.y>=0&&point.x