如何确定从P的边界上的A点开始到P的边界上的B点结束的段是否完全包含在P的内部?
编辑:在这种情况下,没有必要检查该段与多边形边界上的其他段的交点,因为稍后将会这样做。
这可以在恒定的时间内完成吗?
答案 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的中点是否包含在多边形内。维基百科有一篇很好的文章描述了如何确定这一点:http://en.wikipedia.org/wiki/Point_in_polygon。如果你想让事情在数值上稳定,我建议采用绕数法。