确定线段是否在多边形内

时间:2012-08-31 21:30:15

标签: algorithm language-agnostic computational-geometry

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

(v0,v1,....vn)

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

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

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

2 个答案:

答案 0 :(得分:9)

假设点P和凸多边形具有n个顶点V_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或者所有值都是< = 0。

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

注意:此处使用的叉号定义为(u1, u2) x (v1, v2) := (u1 - v2)*(u2 - v1)

答案 1 :(得分:0)

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

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

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