扫描线:找到交点(scanline: finding intersection points)

2019-10-20 09:07发布

我想,以填补扫描线algorith多边形。 为了这个,我要知道那里的扫描线开始与多边形接触所有点。 我写了一个循环这一点,但它显然不工作(它永远不会添加一个点,这意味着它无法找到其切割面的任何点的列表),我可以创建一个多边形,并有从它所有的边缘。

这里是我得到相交多边形XMIN,XMAX,y最小和y是从多边形最大点扫描线的点代码。 他们也是正确的。 包含()检查,如果点在多边形内部,在使用java.awt.Polygon中类。 这是工作压力太大。 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;
            }
        }
    }

Answer 1:

我曾经在一个最小帧运行代码。 它的工作原理,并没有什么不妥的地方。

我建议你检查这些陷阱:

  • Polygon.contains()检查字面上点是否内部 。 因此,倘若你的多边形出发点(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;
    }
}


文章来源: scanline: finding intersection points
标签: java scanline