线段与凸多边形的交点

时间:2013-11-28 15:23:44

标签: algorithm math graphics computational-geometry

寻找O(logn)算法来识别与扩展线段相交的凸多边形的线段。众所周知,线段完全位于凸多边形内部 例: 输入:ab / 线段 /,{1,2,3,4,5,6} / CCW顺序的凸多边形顶点及其坐标 /
输出:3-4,5-6

enter image description here

这可以通过获取所有线的方程并检查它们是否相交但是将是O(n)来完成,因为需要检查n条线以进行交叉。我认为应该可以使用二进制搜索(因为登录界限)来降低复杂性,但我无法理解应用它的内容。

1 个答案:

答案 0 :(得分:2)

首先,您需要使用定向多边形边并将它们存储在一个数组中(或者可以在另一个数据结构中,这允许直接访问时间复杂度不超过 O(logN) )。链表不利于这个问题。

此外,您需要为您的扩展段指定方向 - 让我们说它从A到B的方向。然后它将平面划分为两个半平面 - 左和右。您可以选择初始边(顶点为0和1),然后选择中间边(顶点为[n / 2] -1和[n / 2])。有两种情况 - 初始边缘与扩展段相交或不相交。我会在这里考虑第一个案例,将第二个案例留给你。此外,我假设初始边缘完全位于右半平面(左平面情况是对称的)。中间边缘将多边形划分为两个边缘路径 - 我将其称为 第一个 一个(顶点从0到[n / 2])和 第二个 一个(从[n / 2]到0的顶点)。

可能有五种情况 - 中间边缘可以:

  1. 完全位于右半球(与初始边缘相同),跟随初始边缘 - 然后递归分析第二条路径。
  2. 完全位于右侧背板(与初始边缘相同),位于初始边缘 - 然后您递归分析第一条路径。
  3. 完全位于左半平面(不是初始边缘的那个) - 然后你必须递归分析两个路径。
  4. 将从右半平面到左半平面的扩展段相交 - 找到一个交点,然后递归分析第二条路径。
  5. 将从左半平面到右半平面的扩展段相交 - 找到一个交点,然后递归分析第一条路径。
  6. 所以 - 最“不方便”的情况是(2) - 在这种情况下你不能删除任何路径,但看起来它不能重复整个多边形。

    此外,您还必须计算定向多边形边缘之间的关系 - “跟随/先行”。可以使用相对边缘角度来完成 - “跟随”边缘必须相对于“前”边缘向左转(因为凸起)。