包含所有直线交叉点的最小矩形

时间:2012-06-09 00:09:50

标签: geometry lines

我正在尝试找到一种算法,该算法将找到一组线的所有交点,并计算包含O(n log n)时间内所有交点的最小矩形。到目前为止,我猜它与二元和凸壳有关,但我有点坚持它实际上如何帮助我解决这个问题。

如果有人对此有所了解,请告诉我。谢谢:))

2 个答案:

答案 0 :(得分:3)

让我们从一个B [0]开始,它最小化三角形中的三个交叉点。

如果找不到三角形,那么我们有以下特殊情况之一可以单独处理:

  1. 所有行都是平行的。
  2. 所有十字路口都在一条线上。如果除了一条线之外的所有线都是平行的,就会发生这种情况。
  3. 所有线条在一个点相交。
  4. 因此,让我们忽略这些情况作为细节,并假设可以找到一个三角形,找到它不会给算法增加太多时间。

    阶段1 - 增加框以包含每行的一个交叉点:

    1. 标记形成初始三角形的三条线。
    2. 选择一条未标记的线条,找到带有标记线条的交点P.这总是可行的,因为至少有三条不相互平行的标记线。
    3. 将该框展开以包含P.
    4. 从2开始重复,直到标记了所有行,即它们在框中至少有一个交叉点。
    5. 调出结果框B [0]。

      阶段2 - 检测线条之外是否有交叉点:

      这是关键的观察结果:对于在框内相交的两条线A和B,顺时针绕着框走,我们遇到交替的线:例如A B A B.对于与盒子外侧相交的两条线,顺时针行走不会交替:例如A B B A.当然,线条可能在框边界上相交,或者是并发的,但在描述主算法后,这将被视为细节。

      1. 选择线条的方向:如果线条不是水平线,则将线条指向+ y方向,让水平线条朝向+ x直线。线条的一个东西是箭头,然后箭头全部被选择为尽可能多地指向,或者如果它们是水平的则向右指向。使用此方向时,每条线都有一个进入框的点(定向线指向框中,以及一个退出点。这些可能是相同的点。
      2. 通过沿着边界顺时针方向行走EXITING交叉点,从右上角开始,创建线条的“退出序列”。
      3. 通过从框的右上角开始顺时针方向行走输入交叉点,创建线条的“输入序列”。
      4. 如果所有交叉点都在框内,则进入和退出序列将相互循环,B [i]是交叉点的最小边界框。
      5. 否则,将两个序列对齐到任意元素(通过循环旋转)。
      6. 查找序列中首先不同的元素。这两行必须在盒子外面有一个交叉点P,所以通过将B [i]增长到包括P来形成B [i + 1]。
      7. 从2开始重复。
      8. 这是不完整的,因为如果组线在边界上具有共同的进入或退出点,则进入和退出序列没有很好地定义。对于具有共同进入或退出点的每组线L,使用稍大的框来订购L.

        请注意,此算法不会发出所有交叉点,但它确实(我希望)该框包含所有交叉点。

答案 1 :(得分:1)

在O(n log n)时间?哇。我没想到这是可能的。

我在这里没有看到任何其他答案,所以这里有一个想法 - 无可否认地在黑暗中拍摄。你可以按照自己的意愿去做。

想法:首先按轴承或斜率对线进行排序。在其他条件相同的情况下,几乎平行的线似乎可能在外围点相交;当然,这是你感兴趣的外围点。

你的凸壳概念听起来应该是正确的,但考虑到船体可能有几乎平行的边,其切线或延伸部分远离感兴趣的区域。总而言之,这听起来像是一项重要的编程工作。祝你好运。