扫描线:找到交叉点

时间:2014-06-28 13:49:08

标签: java scanline

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

1 个答案:

答案 0 :(得分:1)

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

我建议你查看这些陷阱:

  • Polygon.contains()从字面上检查一个点 in 。所以例如如果您的多边形是从点(10,10)开始的矩形,则contains(10, 10)将返回false。只有contains(11, 11)才会返回true。所以你找不到真正的交叉点,而是找到第一个(和最后一个)点。
  • (对不起,我自己偶然发现了它)确保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;
    }
}