确定一个点是不是位于任意形状内?

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:想象一下你站在形状的某个角落,想知道它是否有一个封闭的部分(即包含循环)。如果您沿着边界移动并遇到边界与自身相交的某个点,这意味着该形状包含一个闭合部分(即存在一个循环),您可以应用任何您喜欢的方法来检查该点是否在内部。否则,形状可能只是空间中的一条曲线,如果立即开始检查点是否在内部,可能会得到错误的结果。

以上是关于确定一个点是不是位于任意形状内?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种聪明的方法来确定任意形状内部的点?

确定 CGPoint 是不是在图像区域内

确定一个点是不是在一个区域内

确定一个点是不是在 3D 空间中的三角形内

使用opencv确定一个点是在形状内部还是外部

如何确定位置是不是在 UIbezierPath 内?