说我有一个多边形。它可以是凸的也可以是凸的,它并不重要,但它没有孔。它还有"内部"顶点和边,意味着它被分区。
当我想检查一个点是否在那种多边形内时,是否有任何流行/已知的算法或标准程序?
我问,因为绕线编号和光线投射在这种情况下不准确
提前致谢
答案 0 :(得分:1)
您需要澄清“内顶点和边缘”的含义。让我们来看一个非常笼统的案例,希望你能找到相关性。
光线投射(多边形点)算法拍摄一条光线,计算与POLYGON两侧的交叉点(奇数交点=内部,偶数=外部)。
因此,无论是从不相交的梯形孔内部还是三角形孔(内边缘?)开始,或者即使多边形的一部分完全分离和/或自相交,它也能准确地给出正确的结果。
但是,您以什么顺序提供多边形的顶点,以便正确评估所有点?
虽然这是特定于代码的,但如果您正在使用计算与多边形两侧的每个交点的实现,那么这种方法将起作用 -
- 将主多边形分解为多边形组件。例如 - 梯形孔是多边形分量
- 以(0,0)顶点开始(不管(0,0)是否实际上位于多边形上),然后是第一个组件'顶点,在最后一个顶点后重复其第一个顶点。
- 包括另一个(0,0)顶点
- 包括下一个组件,在最后一个顶点后重复其第一个顶点
- 对每个组件重复上述两个步骤
- 以最终(0,0)顶点结束
2分量例如 - 令两个分量的顶点为(1x,1y),(2x,2y),(3x,3y)和(Ax,Ay),(Bx,By),(Cx,Cy)。其中(Ax,Ay),(Bx,By),(Cx,Cy)可以是不相交的三角形孔,交叉三角形或分离的三角形。
因此,在数学上等同于2个分量的奇异连续多边形的顶点是 -
<强>(0,0),(1X,1Y),(2X,2Y),(3X,3Y),(1X,1Y),(0,0),(AX,AY),(Bx的,By),(Cx,Cy),(Ax,Ay),(0,0)
要了解它是如何工作的,请尝试在便笺簿上绘制这个数学上等效的多边形.-
1.标记所有顶点但尚未加入它们
2.另外标记重复的顶点。通过将它们标记为接近原始点而不是它们来执行此操作。 (距离 e ,其中 e-> 0 (倾向于/接近))(以帮助可视化)
3.现在以正确的顺序连接所有顶点(如上例所示)
您会注意到这会形成一个连续的多边形,并且只有在e = 0的限制时变得不相交
您现在可以将此数学上等效的多边形发送到光线投射功能(甚至可能是绕线编号功能?)而没有任何问题。