Algorithm 奇偶算法如何计算多边形边?

Algorithm 奇偶算法如何计算多边形边?,algorithm,geometry,intersection,point-in-polygon,Algorithm,Geometry,Intersection,Point In Polygon,我想知道奇偶算法是如何识别复杂多边形中的点的 我现在知道的是,它将从最左边到点进行水平搜索,并计算接触的边数 但是,如果接触的边位于两条边的交点上,会发生什么情况?这算什么 多边形示例: 我喜欢这样做,它适用于整数和浮点坐标,是: 对于非水平管段,每个管段包括其最底部的点,但不包括其最顶部的点 在偶数-奇数计数中根本不包括水平段 这可以确保多边形内的每个点和多边形外的每个点的奇偶计数都是正确的,但边界上的点并不完全一致。如果这对您很重要,您可能需要添加一条规则,即实际位于线段上的任何点都包括在多

我想知道奇偶算法是如何识别复杂多边形中的点的

我现在知道的是,它将从最左边到点进行水平搜索,并计算接触的边数

但是,如果接触的边位于两条边的交点上,会发生什么情况?这算什么

多边形示例:


我喜欢这样做,它适用于整数和浮点坐标,是:

对于非水平管段,每个管段包括其最底部的点,但不包括其最顶部的点

在偶数-奇数计数中根本不包括水平段


这可以确保多边形内的每个点和多边形外的每个点的奇偶计数都是正确的,但边界上的点并不完全一致。如果这对您很重要,您可能需要添加一条规则,即实际位于线段上的任何点都包括在多边形中。

我喜欢的方法是,它适用于整数坐标和浮点坐标,即:

对于非水平管段,每个管段包括其最底部的点,但不包括其最顶部的点

在偶数-奇数计数中根本不包括水平段


这可以确保多边形内的每个点和多边形外的每个点的奇偶计数都是正确的,但边界上的点并不完全一致。如果这对您很重要,您可能需要添加一条规则,即实际位于线段上的任何点都包含在多边形中。

处理此问题的方法有很多,但据我所知,最安全的方法是

稍微改变光线方向

这在数字上是安全的,但实现起来并不像听起来那么容易。要么改变整个光线并从头开始计算,要么在相关命中之前的某个地方改变

您需要确保不会形成闭合回路(例如,通过Z字形模式),以便在从原始方向开始的某个圆锥体内交替进行顺时针和逆时针旋转

如果光线与多边形的某条边完全平行且同时接触该边,请忽略该边或将其计数两次或再次更改光线方向

改变光线方向总是安全的,因为它可以避免奇点和数值不稳定性


顺便说一句,你使用的这个多边形内算法是众所周知的名称命中测试

有更多的方法来处理这个问题,但我知道的最安全的方法是

稍微改变光线方向

这在数字上是安全的,但实现起来并不像听起来那么容易。要么改变整个光线并从头开始计算,要么在相关命中之前的某个地方改变

您需要确保不会形成闭合回路(例如,通过Z字形模式),以便在从原始方向开始的某个圆锥体内交替进行顺时针和逆时针旋转

如果光线与多边形的某条边完全平行且同时接触该边,请忽略该边或将其计数两次或再次更改光线方向

改变光线方向总是安全的,因为它可以避免奇点和数值不稳定性


顺便说一句,你使用的这个多边形内算法是众所周知的名字命中测试

这个问题与SO无关。不一定。这是我所知道的关于多边形中点的最好的讨论。讨论了边缘情况,并介绍了一种有效算法的开发。这个问题与SO无关。不一定。这是我所知道的关于多边形中点的最好的讨论。讨论边缘情况,并介绍有效算法的开发。重定向的光线可能会击中另一个顶点,这不是防弹的。@Yvesdao当然是的,在这种情况下,您可能会再次改变方向。。。我教授说,从之字形模式中可以明显看出,我知道实现这一点要比其他答案中的其他技术慢得多,但这是我所知道的唯一安全的方法。即使来自另一个答案的方法也是数值稳定性risc,并且在某些条件下对浮点数不起作用。@Matt Timmermans描述的方法是可证明安全的,并且不需要降低数据质量。它也可以证明,对于算术的简单要求,本质上是单调的,不存在数字问题,毫无意义胡闹。@YvesDaoust在纸上可能是,但在现实生活中,有时甚至ulp错误也会把这搞砸。尤其是当存在缩放或任何其他转换时,而不仅仅是原始数据。在这种情况下,有时只能在一条边上正确检测顶点的接触,而不是在两条边上都造成严重破坏。这些情况需要特殊处理,如果在每个非常接近的边缘附近有其他非接触顶点,例如几乎接触螺旋的螺钉等,则不安全,但这些多边形不是通常使用的多边形,但我在工作中有时会处理它们,不,ulp不会出错。重定向的光线可能会击中另一个顶点
,这不是防弹的。@YvesDaoust是的,在这种情况下,您可能会再次改变方向。。。我教授说,从之字形模式中可以明显看出,我知道实现这一点要比其他答案中的其他技术慢得多,但这是我所知道的唯一安全的方法。即使来自另一个答案的方法也是数值稳定性risc,并且在某些条件下对浮点数不起作用。@Matt Timmermans描述的方法是可证明安全的,并且不需要降低数据质量。它也可以证明,对于算术的简单要求,本质上是单调的,不存在数字问题,毫无意义胡闹。@YvesDaoust在纸上可能是,但在现实生活中,有时甚至ulp错误也会把这搞砸。尤其是当存在缩放或任何其他转换时,而不仅仅是原始数据。在这种情况下,有时只能在一条边上正确检测顶点的接触,而不是在两条边上都造成严重破坏。这些情况需要特殊处理,如果在每个非常接近的边缘附近有其他非接触顶点,例如几乎接触螺旋的螺钉等,则不安全,但这些多边形不是通常使用的多边形,但是我在工作中有时会处理它们,不,ulp不会弄糟。