确定给定点是否在多边形内

时间:2011-03-07 18:59:30

标签: computational-geometry

给定凸多边形作为n个顶点的逆时针列表,给出O(lgn)算法以确定给定点是否在多边形内。假设基本操作采用O(1)。

我认为一个方向:如果一个点位于凸多边形内,那么这些点与所有脊椎或边缘之间的特殊关系是什么?此外,我猜这里的技巧是凸多边形,使算法lgn。

3 个答案:

答案 0 :(得分:12)

我知道这个问题的唯一解决方案需要O(n) polygon 预处理时间。然后,在O(lg n)时间内处理针对预处理多边形的每个查询点。

只需在多边形内部取一个点P(让我们称之为“极点”),并为每个顶点绘制一条从P退出并穿过顶点的光线。将其视为原点为P的极坐标系,整个极面由这些光线细分为扇区。现在,根据您的查询点,您只需将其转换为极点坐标,原点位于我们的极点P。然后只执行二进制搜索以确定包含查询点的特定扇区。扇区内的最终内/外检查(点对边边测试)是一个简单的O(1)操作。每个查询都在二进制搜索所需的O(lg n)时间内处理。

这种方法实际上适用于更大类的多边形,而不仅仅是凸多边形。它涵盖了所谓的星形多边形的类别,即具有一个点的多边形,多边形的整个内部可以从中被“看到”或“观察”。

O(n)预处理时间来自需要提前确定极点的位置。

P.S。我不得不考虑更普遍的案例。如果多边形是凸的,则可以简单地使用其任何顶点作为极点。这样您就可以立即获得O(lg n)算法,无需预处理。

答案 1 :(得分:1)

您可能需要查看此链接,详细信息如何确定某个点是否在复杂多边形内,包括样本(c)代码。

http://alienryderflex.com/polygon/

答案 2 :(得分:0)

点在多边形内部的条件是该点应位于所有线段的同一侧。你应该检查有关点的距离的符号与构成多边形的每个线段 - 如果所有都是相同的符号,则该点在多边形内。谷歌搜索应该为您提供许多算法。