不相交多边形中的点

Point in Disjoint Polygon

我想检查给定点是否位于多边形内。
我已经研究了使用光线投射的多边形方法中的点,但我不确定在给定多边形不相交的情况下它将如何工作。例如,如果多边形的正中央有一个 "hole"。在这种情况下如何使用此功能?

我已经回答了一个类似的问题 here,尽管不清楚我是否对 OP 的问题理解得太透彻。嗯,又来了 -
让我们来看一个非常一般的案例。 带孔和交叉点的多边形

光线投射(多边形中的点)算法发出一条光线,计算与 POLYGON 边的交点(奇数交点 = 内部,偶数 = 外部)。
因此,无论您是从不相交的梯形孔内部还是三角形孔(内边缘?)开始,或者即使多边形的一部分完全分离 and/or 自相交,它都能准确给出正确的结果。
但是,您以什么顺序输入多边形的顶点,以便正确评估所有点?
尽管这是特定于代码的,但如果您使用的是计算与多边形边的每个交点的实现,那么这种方法将起作用 -
- 将主多边形分解为多边形组件。 eg - 梯形孔是一个多边形组件。
- 从 (0,0) 顶点开始(与 (0,0) 实际上位于多边形的位置无关紧要)然后是第一个组件的顶点,在最后一个顶点之后重复它的第一个顶点。
- 包括另一个 (0,0) 顶点。
- 包括下一个组件,在最后一个顶点之后重复它的第一个顶点。
- 对每个组件重复以上两个步骤。
- 以最终 (0,0) 顶点结束。
示例 -

我们拿右边的图,有洞的shell,用上面的方法。在数学上等同于 2 个分量(多边形+孔)的奇异连续多边形的顶点是 -
(外)--------(内孔)
0,1,2,3,4,5,1,0,1,2,3,4,1,0

要了解它的工作原理,请尝试在草稿本上绘制这个数学上等效的多边形。-
1.标记所有的顶点,但先不要加入它们。
2. 也分别标记重复的顶点。通过将它们标记为靠近原始点而不是在它们上面来执行此操作。 (在距离 e,其中 e->0(趋于 to/approaches))(帮助形象化)
3. 现在以正确的顺序连接所有顶点(如上例所示) 您会注意到这形成了一个连续的多边形,并且仅在 e=0 限制时才变得不相交。
您现在可以将这个数学上等效的多边形发送到您的光线投射函数(甚至可能是缠绕数函数?),没有任何问题。