我试图填充一个圆,我在画布上用泛光填充法做了一些点。只有圆应该被填充,外面什么都不应该被填充。所以我制作了一个列表,其中存储了画布上已经标记的所有点。
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是我存储圆内第一个点的数组(如果有更优雅的方法,请友善地告诉我)。
如果您需要有关我的代码的任何其他信息,请告诉我。如果需要的话,我会在几秒钟内编辑它!