Java 扫描线:查找交点

Java 扫描线:查找交点,java,scanline,Java,Scanline,我想用扫描线算法填充多边形。为此,我必须知道扫描线与多边形接触的所有点。 我为此编写了一个循环,但它显然不起作用(它从不向列表中添加点,这意味着它找不到任何切割多边形的点) 我可以创建一个多边形并从中获取所有边 这是我用来获取与多边形相交的扫描线点的代码 xmin、xmax、ymin和ymax是多边形的最大点。它们也是正确的。contains()使用java.awt.polygon类检查点是否位于多边形内。这也起作用了。 wasInside包含一个布尔值,如果最后一个选中的点是否在多边形内部,该

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

这是我用来获取与多边形相交的扫描线点的代码 xmin、xmax、ymin和ymax是多边形的最大点。它们也是正确的。contains()使用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;
            }
        }
    }
boolean wasinder=false;
ArrayList intersectionPoints=新建ArrayList();

对于(int yTemp=ymin;yTemp,我已经在一个最小的框架内运行了您的代码。它工作正常,没有任何问题

我建议您检查以下陷阱:

  • Polygon.contains()
    逐字检查点是否在内部。例如,如果您的多边形是从点(10,10)开始的矩形,则
    contains(10,10)
    将返回false。只有
    contains(11,11)
    将返回true。因此,您没有找到真正的交点,而是找到内部的第一个(和最后一个)点
  • (对不起,我自己偶然发现的)确保x和y没有混淆
  • 检查方向:如果你使用画布,(0,0)是左上角的点。但是如果你拿一本数学书看一个笛卡尔图,(0,0)是左下角的点-除非你有负值。方向会在某个地方混淆吗
  • 如何检查是否将某些点添加到
    intersectionPoints
    ?这应该可以工作:
    System.out.println(“找到的交点的编号:”+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;
    }
}

for(int-xTemp=xmin;xTemp谢谢你的帮助,我把xmin和xmax搞混了。还有一点很重要,那就是它找不到多边形边界上的点。要解决这个问题,我可以说:
intersectionPoints.add(new Point(xTemp-1,yTemp))
?因为我认为x值总是1像素到1像素高。如果扫描线进入多边形,多边形的边界将向左1像素。如果扫描线离开多边形,多边形的边界将是刚刚检查的点。但是这样做,您仍然无法正确找到y轴相交部分。对于正确的解决方案,我很抱歉注意,我认为您必须使用
java.awt.geom.Line2D
,以找到真正的交点,或者使用
java.awt.geom.Area.intersect(Area)
。找到一个好的开始。