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

Posted

技术标签:

【中文标题】确定给定点是不是在多边形内【英文标题】:determine if a given point is inside the polygon确定给定点是否在多边形内 【发布时间】:2011-03-07 18:59:29 【问题描述】:

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

我认为一个方向是:如果一个点在一个凸多边形内,那么这些点与所有顶点或边缘之间的特殊关系是什么?另外,我猜这里的诀窍是使算法 lgn 的凸多边形。

【问题讨论】:

这里有一个提示,如果它在外部,则从该点向多边形绘制一条无限线,如果在内部,则在任何方向上绘制一条无限线,这条线有多少个交叉点?我相信这会回答你的问题。 @Jesus Ramos:该算法适用于任何多边形(不仅仅是凸多边形),它是O(n)。在这种情况下,重点是通过使用多边形是的事实来提出O(lg n)算法。 @Jesus,我错过了什么吗? AFAIK,你的建议是O(n),而不是O(log(n)) 见:erich.realtimerendering.com/ptinpoly @Bart Andrey 的回答是我得到的提示,我通常不喜欢透露这类问题的答案,我喜欢让人们思考一下。 【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

您可能想查看此链接,了解如何确定一个点是否在复杂多边形内的详细信息,包括示例 (c) 代码。

http://alienryderflex.com/polygon/

【讨论】:

【参考方案3】:

点位于多边形内的条件是该点应位于所有线段的同一侧。您应该使用构成多边形的每条线段检查相关点的距离的 符号 - 如果所有符号都相同,则该点位于多边形内部。谷歌搜索应该会给你很多算法。

【讨论】:

但那是O(n) 算法,而不是O(log(n)) 算法。 不满足要求,因为它是O(n) 复杂度。

以上是关于确定给定点是不是在多边形内的主要内容,如果未能解决你的问题,请参考以下文章

如何确定一个点是不是在二维凸多边形内?

是否可以使用 JavaScript 确定 GeoJSON 点是否在 GeoJSON 多边形内?

确定点是不是在多边形内

如何在 N 时间内确定一个点是不是在 2D 凸多边形内

已知一个多边形的所有顶点坐标,如果确定一点是不是在这个多边形内?

如何确定坐标是不是在多多边形内?