我想用扫描线算法填充多边形。为此,我必须知道扫描线与多边形接触的所有点。 我为此写了一个循环,但它显然不起作用(它从未在列表中添加一个点,这意味着它找不到任何切割多边形的点) 我可以创建一个Polygon并从中获得所有边缘。
这是我的代码,用于获取与多边形相交的扫描线的点 xmin,xmax,ymin和ymax是多边形的最大点。他们也是对的。 contains()使用java.awt.Polygon类检查Point是否在多边形内部。这也有效。 wasInside包含一个布尔值,如果检查的最后一个点是否在多边形内,则保存旧状态。
boolean wasInside = false;
ArrayList<Point> intersectionPoints = new ArrayList<Point>();
for (int yTemp = ymin; yTemp <= ymax; yTemp++) {
for (int xTemp = xmin; xTemp <= xmax; xTemp++) {
if (wasInside != this.contains(new Point(xTemp, yTemp))) {
intersectionPoints.add(new Point(xTemp, yTemp));
wasInside = !wasInside;
}
}
}
答案 0 :(得分:1)
我已在最小的框架中运行您的代码。它有效,它没有任何问题。
我建议你查看这些陷阱:
Polygon.contains()
从字面上检查一个点 in 。所以例如如果您的多边形是从点(10,10)开始的矩形,则contains(10, 10)
将返回false。只有contains(11, 11)
才会返回true。所以你找不到真正的交叉点,而是找到第一个(和最后一个)点。intersectionPoints
?这应该有效:System.out.println("Nb of intersection points found: " + intersectionPoints.size());
在此之后,它应该适合你。您可能希望打印出检查的内容以便更好地理解:
for (int xTemp = xmin; xTemp <= xmax; xTemp++) {
System.out.println("Check: " + xTemp + ", " + yTemp);
if (wasInside != this.contains(new Point(xTemp, yTemp))) {
System.out.println(" - Inside! Bash!");
intersectionPoints.add(new Point(xTemp, yTemp));
wasInside = !wasInside;
}
}