渐近最优算法,用于计算线是否与凸多边形相交

时间:2010-12-21 09:34:10

标签: algorithm line computational-geometry asymptotic-complexity convex-polygon

检测线是否与凸多边形相交的O(n)算法在于检查多边形的任何边是否与线相交,并查看交点的数量是奇数还是偶数。

是否存在渐近更快的算法,例如一个O(log n)一个?

5 个答案:

答案 0 :(得分:17)

lhf的答案接近正确。这是一个应该解决他的问题的版本。

让多边形以逆时针顺序具有顶点v0,v1,...,vn。让点x0和x1在线上。

注意两件事:首先,找到两条线的交点(并确定它的存在)可以在恒定时间内完成。其次,确定一个点是否在一条线的左侧或右侧可以在恒定的时间内完成。

我们将遵循lhf的相同基本思想来获得O(log n)算法。基本情况是多边形有2或3个顶点。这些都可以在恒定的时间内处理。

确定线(v0,v(n / 2))是否与线(x0,x1)相交。

案例1:它们不相交。

在这种情况下,我们感兴趣的线要么是分割多边形的线的左边还是右边,所以我们可以递归到多边形的那一半。具体来说,如果x0在(v0,v(n / 2))的左边,那么右半部分中的所有顶点,{v0,v1,... v(n / 2)}都在同一侧of(x0,x1)所以我们知道多边形的“一半”没有交集。

案例2:它们相交。

这种情况有点棘手,但我们仍然可以在恒定时间内将交点缩小到多边形的一半。有3个子类:

案例2.1:交点介于点v0和v(n / 2)之间

我们完成了。该线与多边形相交。

案例2.2:交点更接近v0(即v0侧多边形外)

确定线(x0,x1)是否与线(v0,v1)相交。

如果没有,那么我们就完成了,这条线不会与多边形相交。

如果是,请找到交叉点,p。如果p在行的右边(v0,v(n / 2)),则递归到多边形的右半部分{v0,v1,...,v(n / 2)},否则递归向左“半”{v0,v(n / 2),... vn}。

在这种情况下的基本思想是多边形中的所有点都在线的一侧(v0,v1)。如果(x0,x1)在与(v0,v(n / 2))的交叉点的一侧偏离(v0,v1)。我们知道在那一侧不能与多边形交叉。

案例2.3:交叉点更靠近v(n / 2)

此案例与案例2.2类似,但使用适当的v(n / 2)邻居。

我们完成了。对于每个级别,这需要两个线交叉点,左右检查,以及确定点在一条线上的位置。每次递归将顶点数除以2(技术上将它们除以至少4/3)。所以我们得到一个O(log n)的运行时。

答案 1 :(得分:3)

我认为this article给出了明确的O(log n)解决方案。找到与给定直线垂直的方向的极值。

答案 2 :(得分:2)

边界框可能有用。

回想一下,仿射空间的凸部是其所有包络超平面的交点:通过仅考虑包络超平面的子集的交点,可以得到多边形的近似值(读取“边界凸多边形”) ,测试你的线与此近似值的交点,并在必要时进行细化。

如果您期望交叉路口数量较少,所有这些效果会更好。

答案 3 :(得分:1)

您只需找到位于线左侧的A点和右侧的另一个点。剩下的问题是如何快速找到这些要点。

答案 4 :(得分:0)

从凸poligon中随机取两个A点和B点。

  • 如果它们位于线的不同侧,则它们相交
  • 如果它们位于同一侧,则在两个poligon部分(顺时针方向AB和BA)上执行:
    • 创建一条与您的第l行平行的线,该线经过A
    • 在poligon上与l的最大距离处找到点,这与在第一次单调非减少的函数中找到最大值相同,然后单调地不增加。这可以通过三元搜索
    • 在O(log n)中完成


如果那两个最远的点位于你的线的不同侧,则线与poligon相交,否则它不会
顺便说一下,你也可以在O(log n)中找到实际的交叉点。