我正在尝试填充一个圆圈,我使用填充方法在我的画布上用一些圆点制作。只有圆圈才能被填满,外面没有任何东西。所以我制作了一个列表,其中我存储了已在画布中标记的所有点。
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是我将第一个点存储在圆圈内的数组(如果有更优雅的方式,请善待并告诉我)。 如果您需要有关此问题的代码的任何其他信息,请与我们联系。如果需要,我会在几秒钟内编辑它!
答案 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)
无法绘制并抛出异常。