两条折线之间的距离

时间:2017-08-24 12:19:33

标签: algorithm performance computational-geometry

我想计算两条折线之间的距离 d

polyline-polyline-distance

显然我可以检查所有线段对的距离并选择最小距离,但这样算法运行时 O(n 2 。有没有更好的方法?

2 个答案:

答案 0 :(得分:3)

分而治之:

  • 定义表示一对折线的数据结构及其axis-aligned minimum bounding boxes (AAMBB)之间的最小距离:pair = (poly_a, poly_b, d_ab)

  • 使用距离pair作为密钥,为d_ab数据结构创建一个空队列。

  • 使用初始折线创建pair数据结构并将其推入队列。

  • 我们将保留一个变量,其中包含到目前为止找到的折线之间的最小距离(min_d)。将其设置为无限。

  • 重复:

    • 从队列中弹出距离最小的元素d_ab

    • 如果d_ab大于min_d,我们就完成了。

    • 如果任何折线poly_apoly_b包含唯一的细分:

      • 使用强力查找当时之间的最小距离并相应地更新min_d
    • 否则:

      • 将折线poly_apoly_b分成两半,例如:

        (1-7) --> { (1-4), (4-7) }

        (8-12) --> { (8-10), (10-12) }

      • 制作两个集合的交叉积,创建4个新的pair数据结构,然后将其推入队列Q.

在一般情况下,复杂度为O(N * log N),最坏情况可能为O(N²)。

更新:Perl中实现的algorithm

答案 1 :(得分:1)

"标准"这种问题的方法是构造几何实体的Voronoi图。这可以在时间O(N Log N)中完成。

但是线段的这种图表的构建很困难,你应该采用现成的解决方案,例如CGAL。