1

我想用扫描线算法填充一个多边形。为此,我必须知道扫描线与多边形接触的所有点。我为此写了一个循环,但它显然不起作用(它从不在列表中添加一个点,这意味着它找不到任何切割多边形的点)我可以创建一个多边形并从中获取所有边。

这是我的代码,用于获取与多边形相交的扫描线点 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;
            }
        }
    }
4

1 回答 1

1

我已经在最小的框架中运行了您的代码。它有效,没有任何问题。

我建议你检查这些陷阱:

  • Polygon.contains()从字面上检查一个点是否在里面。因此,例如,如果您的多边形是从点 (10, 10) 开始的矩形,那么contains(10, 10)将返回 false。只会contains(11, 11)返回真。所以你没有找到真正的交点,而是里面的第一个(和最后一个)点。
  • (对不起,我自己偶然发现了它)确保 x 和 y 无处混淆。
  • 检查方向:如果您使用画布, (0, 0) 是左上角。但是如果你拿一本数学书看一个笛卡尔图,(0, 0) 是左下角——除非你有负值。方向会在某个地方混淆吗?
  • 你如何检查是否添加了一些点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;
    }
}
于 2014-06-28T15:10:49.617 回答