确定一个点是不是位于任意形状内?
Posted
技术标签:
【中文标题】确定一个点是不是位于任意形状内?【英文标题】:determine if a point sits inside an arbitrary shape?确定一个点是否位于任意形状内? 【发布时间】:2011-06-26 20:21:22 【问题描述】:给定一个点的坐标,我如何确定它是否在任意形状内?
形状由点数组定义,我不知道形状在哪里“闭合”,我真正需要帮助的部分是找出形状闭合的位置。
这里有一张图片可以更好地说明我的意思:
【问题讨论】:
形状没有打开...我只是不知道它在哪里关闭。 您必须说明形状是如何由点数组定义的。如果您的意思是点数组是形状内的点集,那么问题就很简单了。 我帖子中的图片可能会更好地解释它。我知道蓝线沿线的点,但不知道关闭形状的十字在哪里 形状是多边形,还是可以用任何数学函数定义形状(例如,x^2+2y^2 = r^2)? 【参考方案1】:最简单的方法是从该点投射光线并计算它穿过边界的次数。如果是奇数,则点在里面,偶数点在外面。
维基:http://en.wikipedia.org/wiki/Point_in_polygon
请注意,这只适用于多种形状。
【讨论】:
这似乎不适用于问题中显示的形状,因为多边形外部的两个末端。一个必要的预处理步骤是识别闭合点并丢弃这两个末端。【参考方案2】:如果您想确定点 P 是否为任意形状,我会简单地从 P 开始运行泛洪填充。如果您的泛洪填充离开了预先确定的边界框,那么您就在形状之外。否则,如果您的洪水填充终止,那么您就在形状内:)
我相信这个算法是 O(N^2),其中 N 是点数,因为最大面积与 N^2 成正比。
***:Flood Fill
【讨论】:
【参考方案3】:实际上,如果给定一个点数组,可以如下检查形状的接近度:
考虑数组中给定的点对 P[i]
和 P[i+1]
- 它们形成了形状边界的某些部分。您需要检查的是是否存在两个这样的段相交,可以在O(N^2)
时间检查(只需检查所有可能的此类段对)。如果存在交叉点,则表示您的形状是闭合的。
注意:您必须注意不要忘记检查段P[0],P[n-1]
(即数组中的第一个和最后一个点)。
【讨论】:
p[i],p[i+1] 和 p[j],p[j+1] 什么时候相交?我认为它可以判断形状是简单多边形还是复杂多边形。此外,您没有回答关于如何查找该点是否位于多边形中的原始问题。 @logic_max:嗯,我回答了关于如何检查形状是否闭合的部分,根据问题陈述,它不一定是多边形,它可以是一个任意折线。任何 p[i],p[i+1] 和 p[j],p[j+1] 交集的存在只会告诉我们形状有一个封闭的部分。里面的重点是什么——Mikola 的回答是正确的。 那行不通。如果你取一个封闭的多边形,然后给它添加一个悬垂边怎么办?事实上,我不确定您到底在测试什么,以及它与问题的关系如何? @Mikola:想象一下你站在形状的某个角落,想知道它是否有一个封闭的部分(即包含循环)。如果您沿着边界移动并遇到边界与自身相交的某个点,这意味着该形状包含一个闭合部分(即存在一个循环),您可以应用任何您喜欢的方法来检查该点是否在内部。否则,形状可能只是空间中的一条曲线,如果立即开始检查点是否在内部,可能会得到错误的结果。以上是关于确定一个点是不是位于任意形状内?的主要内容,如果未能解决你的问题,请参考以下文章