繁体   English   中英

在2D多边形内指向

[英]Point inside a 2D Polygon

以下一段Java代码是确定2D点是否在多边形内的解决方案(从此处获取 )。 我认为这段代码有一些问题。 例如,此多边形:

Point[] polygon = new Point[5];
polygon[0] = new Point(30,20);
polygon[1] = new Point(80,10);
polygon[2] = new Point(75,100);
polygon[3] = new Point(40,100);
polygon[4] = new Point(55,65);

它为(76,82)返回true(内部),但是此点在边缘(代码在边缘的另一点(45,17)正确返回false)。 它还返回(45,90)的false(不在内部),但它在多边形内部。 问题是什么?

public boolean IsPointInPolygon(Point p, Point[] polygon)
{
    double minX = polygon[0].x;
    double maxX = polygon[0].x;
    double minY = polygon[0].y;
    double maxY = polygon[0].y;
    for ( int i = 1 ; i < polygon.length; i++ )
    {
        Point q = polygon[i];
        minX = Math.min(q.x, minX);
        maxX = Math.max(q.x, maxX);
        minY = Math.min(q.y, minY);
        maxY = Math.max(q.y, maxY);
    }

    if ( p.x <= minX || p.x >= maxX || p.y <= minY || p.y >= maxY )
    {
        return false;
    }

    boolean inside = false;
    int j = polygon.length - 1;
    for (int i = 0 ;i < polygon.length ; j = i++)
    {
        if (( polygon[i].y > p.y ) != ( polygon[j].y > p.y) &&
                p.x <= (polygon[j].x - polygon[i].x ) * ( p.y - polygon[i].y ) / ( polygon[j].y - polygon[i].y ) + polygon[i].x)
        {
            inside = !inside;
        }
    }
    return inside;
}

我想我应该将代码更改为以下代码,但是我不确定!

float tempX = ((float)((polygon[i].x - polygon[j].x) * (p.y - polygon[i].y)) / (polygon[i].y - polygon[j].y)) + polygon[i].x;
if (p.x < tempX) {
    inside = !inside;
}
else if (p.x == tempX) {
    return false;
}

这个算法

if ( p.x <= minX || p.x >= maxX || p.y <= minY || p.y >= maxY )
{
        return false;
}

是错的。 它仅检查点是否在以minX, maxX, minY, maxY边界的矩形内。如果不使用所有多边形顶点就无法测试点是否在多边形内。

使用java.awt.Polygon

public boolean isPointInPolygon(Point p, Point[] points)
    {

        Polygon polygon = new Polygon();//java.awt.Polygon

        for(Point point : points) {

            polygon.addPoint(point.x, point.y);
        }

        return polygon.contains(p);
    }

用测试

    Point[] points = new Point[5];
    points[0] = new Point(30,20);
    points[1] = new Point(80,10);
    points[2] = new Point(75,100);
    points[3] = new Point(40,100);
    points[4] = new Point(55,65);

    System.out.println(isPointInPolygon(new Point(76,82), points) );

打印出false。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM