C# 复合多边形内点

C# 复合多边形内点,c#,point,polygons,point-in-polygon,C#,Point,Polygons,Point In Polygon,我见过许多多边形内点的算法。 到目前为止,我从这个网站了解到: 最佳算法通常如下所示: var inside = false; for (int i = poly.Count - 1, j = 0; j < poly.Count; i = j++) { var p1 = poly.Vertices[i]; var p2 = poly.Vertices[j]; if ((p1.Y < testY != p2.Y < testY) && /

我见过许多多边形内点的算法。 到目前为止,我从这个网站了解到:

最佳算法通常如下所示:

var inside = false;
for (int i = poly.Count - 1, j = 0; j < poly.Count; i = j++)
{
    var p1 = poly.Vertices[i];
    var p2 = poly.Vertices[j];

    if ((p1.Y < testY != p2.Y < testY) && //at least one point is below the Y threshold and the other is above or equal
        (p1.X >= testX || p2.X >= testX)) //optimisation: at least one point must be to the right of the test point
    {
        if (p1.X + (testY - p1.Y) / (p2.Y - p1.Y) * (p2.X - p1.X) > testX)
            inside = !inside;
    }
}
var-inside=false;
对于(int i=poly.Count-1,j=0;j=testX | | p2.X>=testX))//优化:至少有一个点必须位于测试点的右侧
{
如果(p1.X+(testY-p1.Y)/(p2.Y-p1.Y)*(p2.X-p1.X)>testX)
内部=!内部;
}
}
但复合多边形段可以是直线或圆弧。圆弧段由法线2点和用于查找圆弧中心和半径的凸起定义。这两个点用于查找圆弧的起点和终点角度

使用测试点Y和
Math.Asin((testY-arc.Center.Y)/arc.Radius)
我可以找到测试线与圆相交的角度。当测试线与圆相交时,有两个交点。之后,我测试角度,以了解交点是否在圆弧上

到目前为止,我的结果非常好,只是当测试点出现时,它与顶点的
y
完全相同。将对2个相邻段进行计数。对于正常段,if
(p1.Y

对于圆弧部分的复合多边形,我找不到任何类似的实现。有人曾经做过类似的事情或有过任何暗示吗

用这条线

p1.Y < testY != p2.Y < testY
或者,您可以检查交点是否位于圆弧端点(相等的y坐标),并根据角度和圆弧方向评估圆弧是否继续向下。但根据实现情况,这可能会有一些数值稳定性问题。第一个选项(分解成单调的部分)可能更容易实现。并将其推广到其他原语。

使用这一行

p1.Y < testY != p2.Y < testY

或者,您可以检查交点是否位于圆弧端点(相等的y坐标),并根据角度和圆弧方向评估圆弧是否继续向下。但根据实现情况,这可能会有一些数值稳定性问题。第一个选项(分解成单调的部分)可能更容易实现。它推广到其他原语。

你有整数坐标还是浮点坐标?浮点坐标(double)你有整数坐标还是浮点坐标?浮点坐标(double)把弧分成单调的部分并不容易,因为Y轴的同一侧可能有两个部分,但一旦我找到它,它就解决了我的问题。TanksIt不容易将圆弧分割成单调的部分,因为Y轴的同一侧可能有两个部分,但一旦我找到它,它就解决了我的问题。坦克