如果线与凸多边形相交,则为最优算法

我想知道是否有更快的算法,然后O(n)用于检测线是否与凸多边形相交。当您检查多边形的每个边缘,如果它与线相交,并查看交点的数量是奇数还是偶数,我知道算法,我只是看看是否存在一些更快的例如在O(log n)复杂性。

谢谢

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

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

注意两点:首先,找到两条线(并确定其存在)的交点可以在不间断的时间内完成。第二,确定一个点是否在一行的左边或右边可以在恒定的时间内完成。

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

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

情况1:它们不相交。

在这种情况下,我们感兴趣的线是分割多边形的线的左侧或右侧,因此我们可以递归到该多边形的一半。具体来说,如果x0在(v0,v(n / 2))的左边,那么右边的“half”{v0,v1,… v(n / 2)}中的所有顶点都在同一边(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)的运行时。

转载注明原文:如果线与凸多边形相交,则为最优算法 - 代码日志