Flood Fill Java(在 canvas 中填充一个圆圈)
Flood Fill Java (filling a circle in a canvas)
我正在尝试填充一个圆圈,我在 canvas 中用一些点填充了圆圈,使用的是 floodfill 方法。只有圆圈应该被填充,外面什么都没有。所以我做了一个列表,其中我存储了所有已经在 canvas.
中标记的点
private LinkedList<Point> filledpoints = new LinkedList<Point>();
在填充方法中,我现在想给出一个起点,然后我想检查是否可以在这里画一个点,或者那里是否已经有一个点。当然,我用谷歌搜索了 Flood Fill Algorithm,并想出了类似的东西 - 我尝试将该算法与 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);
}
我也尝试过将列表中的点的值存储到数组中,然后检查数组,但它没有帮助。
它总是在第一个递归调用行中给我这个错误:
Exception in thread "AWT-EventQueue-0" java.lang.WhosebugError at
sun.java2d.SunGraphics2D.fillOval(Unknown Source)
此时我做错了什么?或者换句话说:我是否走在正确的轨道上?我以前从未遇到过这个错误,此时我真的很困惑。这甚至是我尝试这样做的正确方法吗?任何提示都会有所帮助,它甚至不需要是代码解决方案! :/
如果需要,我的绘画方法(调用它来执行程序)如下所示:
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 是我存储圆内第一个点的数组(如果有更优雅的方法,请告诉我)。
如果您需要有关此问题的代码的任何其他信息,请告诉我。如果需要,我会在几秒钟内对其进行编辑!
您不检查边缘。 filledpoints
将包含像 Point(-1, 0)
这样的点。然后 fillOval
无法绘制并抛出异常。
我正在尝试填充一个圆圈,我在 canvas 中用一些点填充了圆圈,使用的是 floodfill 方法。只有圆圈应该被填充,外面什么都没有。所以我做了一个列表,其中我存储了所有已经在 canvas.
中标记的点 private LinkedList<Point> filledpoints = new LinkedList<Point>();
在填充方法中,我现在想给出一个起点,然后我想检查是否可以在这里画一个点,或者那里是否已经有一个点。当然,我用谷歌搜索了 Flood Fill Algorithm,并想出了类似的东西 - 我尝试将该算法与 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);
}
我也尝试过将列表中的点的值存储到数组中,然后检查数组,但它没有帮助。 它总是在第一个递归调用行中给我这个错误:
Exception in thread "AWT-EventQueue-0" java.lang.WhosebugError at sun.java2d.SunGraphics2D.fillOval(Unknown Source)
此时我做错了什么?或者换句话说:我是否走在正确的轨道上?我以前从未遇到过这个错误,此时我真的很困惑。这甚至是我尝试这样做的正确方法吗?任何提示都会有所帮助,它甚至不需要是代码解决方案! :/
如果需要,我的绘画方法(调用它来执行程序)如下所示:
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 是我存储圆内第一个点的数组(如果有更优雅的方法,请告诉我)。 如果您需要有关此问题的代码的任何其他信息,请告诉我。如果需要,我会在几秒钟内对其进行编辑!
您不检查边缘。 filledpoints
将包含像 Point(-1, 0)
这样的点。然后 fillOval
无法绘制并抛出异常。