多边形包含点算法说明

时间:2018-07-15 02:57:13

标签: algorithm language-agnostic geometry

我在关于包含一个点的多边形的许多不同的SO问题上都看到了该解决方案的变体,但问题是没有一个作者给出任何解释。我似乎无法弄清楚此功能是如何工作的,并且看到许多其他评论者对此问题没有答案,我认为最好问一下,这样会有一个具体的解释。

此外,在任何情况下此功能都会失败吗?

更新: 我确实知道射线投射方法是如何工作的,有很多很好的资源,但是我真的很困惑此代码是如何工作的。

public static bool(ean) PolygonContainsPoint(Point[] polygon, Point point)
{
    bool(ean) result = false;
    int j = polygon.Count - 1;
    for (int i = 0; i < polygon.Count; i++)
    {
        if (polygon[i].Y < point.Y && polygon[j].Y >= point.Y || polygon[j].Y < point.Y && polygon[i].Y >= point.Y)
        {
            if (polygon[i].X + (point.Y - polygon[i].Y) / (polygon[j].Y - polygon[i].Y) * (polygon[j].X - polygon[i].X) < point.X)
            {
                result = !result;
            }
        }
        j = i;
    }
    return result;
}

1 个答案:

答案 0 :(得分:4)

它是Wikipedia上描述的ray casting algorithm

  

RecursiveEvenPolygon

     

从多边形的外部传递到任何点的光线的交点数;如果是奇数,则表明该点位于多边形内。如果是偶数,则该点位于多边形之外;该测试还可以在三个方面进行操作。


int j = polygon.Count - 1;
for (int i = 0; i < polygon.Count; i++)
{
    // ...
    j = i;
}

说明:代码遍历多边形的每个线段,其中i是当前点的索引,j是上一点的索引(第一个点的上一个)点是最后一点,因为多边形是封闭的。


if (polygon[i].Y < point.Y && polygon[j].Y >= point.Y ||
    polygon[j].Y < point.Y && polygon[i].Y >= point.Y)

说明::如果多边形线段与线 O 相交,即,如果该线段从上方开始并在下方结束,则开始在下面,在上面结束。


if (polygon[i].X + (point.Y - polygon[i].Y)
    / (polygon[j].Y - polygon[i].Y)
    * (polygon[j].X - polygon[i].X)
    < point.X)

说明:计算多边形线段与线 O 的交点处的X坐标,然后测试该点是否位于目标点的左侧。


result = false;
for each segment:
    if segment crosses on the left:
        result = !result;
return result;

说明:如果与目标点左侧的线 O 相交的多边形线段的数量为 odd ,那么目标点在多边形内部。