给定凸多边形作为n个顶点的逆时针列表,给出O(lgn)算法以确定给定点是否在多边形内。假设基本操作采用O(1)。
我认为一个方向:如果一个点位于凸多边形内,那么这些点与所有脊椎或边缘之间的特殊关系是什么?此外,我猜这里的技巧是凸多边形,使算法lgn。
答案 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)代码。
答案 2 :(得分:0)
点在多边形内部的条件是该点应位于所有线段的同一侧。你应该检查有关点的距离的符号与构成多边形的每个线段 - 如果所有都是相同的符号,则该点在多边形内。谷歌搜索应该为您提供许多算法。