【问题标题】:determine if line segment is inside polygon确定线段是否在多边形内
【发布时间】:2012-08-31 21:30:15
【问题描述】:

假设我们有带顶点的凸多边形

(v0,v1,....vn)

我的目标是确定对于给定点p(x,y) 连接该点和多边形任何顶点的任何线段是否在多边形内,甚至对于给定的两个点

p(x0,y0)  `p(x1,y1)`

连接这两点的线段在多边形内吗? 我已经搜索了很多关于这个的网站,但我仍然很困惑,一般我认为我们必须比较顶点的坐标,并通过确定哪个点的坐标小于或大于另一个点的坐标,我们可以确定任何线段的位置,但是我不确定这是多么正确,请帮助我

【问题讨论】:

  • 你想好一种语言吗?
  • 你的意思是编程语言,没关系,但是好的c++
  • 多边形是凸的吗?通过检查点与所有边缘的共线性,这将使任务几乎变得微不足道。对于一般的多边形,您可能可以使用某种扫描线算法
  • 所以对于凸多边形,我们会检查点是否与多边形的顶点共线?
  • 我删除了 C++ 标签,因为问题与语言无关

标签: algorithm language-agnostic computational-geometry


【解决方案1】:

假设一个点P 和一个凸多边形,其顶点nV_1V_n (n > 2)。

按相对于选定顶点的角度对多边形的顶点进行排序,以便它们按顺时针或逆时针顺序排列。那么多边形的边是V_1 -> V_2, V_2 -> V_3, ..., V_(n-1) -> V_n, V_n -> V_1

现在,对于每条边,检查叉积 (V_(i+1) - V_i) x (P - V_i) 的值。现在P 在多边形内,如果所有值都 >= 0 或所有值都

对于多边形不必是凸面的更普遍的问题,有一个很好的tutorial on TopCoder。他们所做的是从测试点发送一条射线并检查它与多少条边相交。

注意:这里使用的叉积定义为(u1, u2) x (v1, v2) := u1*v2 - u2*v1

【讨论】:

  • 抱歉如何对多边形的边进行排序?
  • 如果您以顺时针或逆时针顺序给出顶点,这已经为您完成了。如果没有,您可以取一个顶点,然后按照它们与所选顶点之间的差异向量的角度对其余的顶点进行排序。
  • 所以这意味着我必须计算两个顶点之间的角度然后排序?或者如何?
  • 你取一个顶点(比如V_1)作为参考点,然后计算所有的向量V_i - V_1,并按照结果向量的角度对V_i进行排序
  • 很遗憾链接失效了
【解决方案2】:

如果您的多边形是凸的,并且您在当前多边形之外添加一个新点,即您要检查它是在多边形外部还是内部的点,则生成的多边形将是凸的。在实践中,这意味着上述格雷厄姆扫描永远不会失败,并且添加的点位于多边形之外。

然而,一种更快更好的方法是将点投影到多边形边缘的法线轴上。这依赖于分离平面定理。如果点和多边形的边缘之间有一条线,则它在外面。 对于多边形的每条边,取法线。将该点投影到该边的法线轴上。对所有法线​​执行此操作,并检查该点是否在该投影轴的多边形的最大和最小投影内。如果总是这样,则该点位于多边形内。如果它失败了,你可以停下来,因为它在外面,因为有一个分离的平面。

这将使算法在线性时间内运行,而不是 O(n log n),因为您不必根据角度对顶点进行排序。当您有大量顶点时,这是理想的选择。

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多