【问题标题】:determine if a point sits inside an arbitrary shape?确定一个点是否位于任意形状内?
【发布时间】:2011-06-26 20:21:22
【问题描述】:

给定一个点的坐标,我如何确定它是否在任意形状内?

形状由点数组定义,我不知道形状在哪里“闭合”,我真正需要帮助的部分是找出形状闭合的位置。

这里有一张图片可以更好地说明我的意思:

【问题讨论】:

  • 形状没有打开...我只是不知道它在哪里关闭。
  • 您必须说明形状是如何由点数组定义的。如果您的意思是点数组是形状内的点集,那么问题就很简单了。
  • 我帖子中的图片可能会更好地解释它。我知道蓝线沿线的点,但不知道关闭形状的十字在哪里
  • 形状是多边形,还是可以用任何数学函数定义形状(例如,x^2+2y^2 = r^2)?

标签: algorithm math geometry shape


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