寻找O(logn)算法来识别与扩展线段相交的凸多边形的线段。众所周知,线段完全位于凸多边形内部
例:
输入:ab / 线段 /,{1,2,3,4,5,6} / CCW顺序的凸多边形顶点及其坐标 /
输出:3-4,5-6
这可以通过获取所有线的方程并检查它们是否相交但是将是O(n)来完成,因为需要检查n条线以进行交叉。我认为应该可以使用二进制搜索(因为登录界限)来降低复杂性,但我无法理解应用它的内容。
答案 0 :(得分:2)
首先,您需要使用定向多边形边并将它们存储在一个数组中(或者可以在另一个数据结构中,这允许直接访问时间复杂度不超过 O(logN) )。链表不利于这个问题。
此外,您需要为您的扩展段指定方向 - 让我们说它从A到B的方向。然后它将平面划分为两个半平面 - 左和右。您可以选择初始边(顶点为0和1),然后选择中间边(顶点为[n / 2] -1和[n / 2])。有两种情况 - 初始边缘与扩展段相交或不相交。我会在这里考虑第一个案例,将第二个案例留给你。此外,我假设初始边缘完全位于右半平面(左平面情况是对称的)。中间边缘将多边形划分为两个边缘路径 - 我将其称为 第一个 一个(顶点从0到[n / 2])和 第二个 一个(从[n / 2]到0的顶点)。
可能有五种情况 - 中间边缘可以:
所以 - 最“不方便”的情况是(2) - 在这种情况下你不能删除任何路径,但看起来它不能重复整个多边形。
此外,您还必须计算定向多边形边缘之间的关系 - “跟随/先行”。可以使用相对边缘角度来完成 - “跟随”边缘必须相对于“前”边缘向左转(因为凸起)。