找出段是否完全位于多边形内部

时间:2014-11-24 17:10:53

标签: algorithm geometry

如何确定从P的边界上的A点开始到P的边界上的B点结束的段是否完全包含在P的内部?

编辑:在这种情况下,没有必要检查该段与多边形边界上的其他段的交点,因为稍后将会这样做。

这可以在恒定的时间内完成吗?

2 个答案:

答案 0 :(得分:1)

根据编辑过的描述,假设多边形是简单的,它表示为逆时针排序顺序的段列表,查询段的内部不与多边形的边界相交,并且查询段的端​​点,我们知道哪个多边形段或多个段包含该端点。

如果端点是多边形顶点,则有两种可能的情况。通过比较相对于顶点的角度和2D行列式测试,可以在恒定时间内区分这些。

Case 1: segment not in polygon

        \ query segment
         \
*<--------*<--------*
  polygon
  interior


Case 2: segment in polygon

*<--------*<--------*
  polygon  \
  interior  \ query segment

如果端点位于多边形线段的内部,那么就会进行类似的测试(假装那里有一个顶点)。

以下是角度测试的详细信息。翻译所有内容,使多边形顶点位于(0,0)。然后我们有

(e,f)     (0,0)     (c,d)
  *<--------*<--------*
    polygon  \
    interior  \ query segment
               *
             (a,b)

旋转(并缩放,而不是重要)所有内容,以便查询段位于x轴上。这是通过乘以矩阵

来实现的
[ a b]
[-b a]

获取新图

        * (ac+bd,ad-bc) = (p,q)
       /
      /
    |_     query
    *-----------* (a^2+b^2,0)
   /
  /
|_
* (ae+bf,af-be) = (r,s).

根据我们的退化假设,(p,q) != (0,0)。现在,(p,q)位于上半平面q>0 || (q==0 && p>0)。否则,它位于下半平面。同样适用于(r,s)

如果(p,q)位于上半平面且(r,s)位于下半平面,则查询段位于内部。反之亦然,那就在外面。否则,这些点位于同一个半平面内。决定因素测试是ps-qr > 0(内部)还是ps-qr < 0(外部)。它不能相等,因为多边形很简单。

也许比我更了解情况的人可以从四分之一中降低这个测试的程度。

答案 1 :(得分:0)

如果我理解你的问题,你试图区分以下两种情况:

  • AB完全在多边形
  • 除端点外,AB完全在多边形
  • 之外

我们已经排除了AB部分位于多边形内部的情况,因为您已经测试过AB是否与每一侧相交。

在我看来,你的问题等同于询问AB的中点是否包含在多边形内。维基百科有一篇很好的文章描述了如何确定这一点:http://en.wikipedia.org/wiki/Point_in_polygon。如果你想让事情在数值上稳定,我建议采用绕数法。