Расстояние между двумя полилиниями

Я хочу рассчитать расстояние d между двумя полилиниями:

polyline-polyline-distance

очевидно, я мог бы проверить расстояние для всех пар линейных сегментов и выбрать наименьшее расстояние, но таким образом algorithmn будет иметь время выполнения O (n2). Есть ли лучший подход?

2 ответов


Разделяй и властвуй:

  • определите структуру данных, представляющую пару полилиний и минимальное расстояние между их выровненные по оси минимальные ограничители (AAMBB):pair = (poly_a, poly_b, d_ab))

  • создайте пустую очередь для pair структуры данных, используя расстояние d_ab как ключ.

  • создать pair структура данных с начальными полилиниями и нажмите ее в очередь.

  • мы будем держать переменную с минимальным расстоянием между полилиниями, найденными до сих пор (min_d). Установите бесконечность.

  • повторю:

    • Pop из очереди элемент с минимальным расстоянием d_ab.

    • если d_ab больше min_d мы сделали.

    • если любой из полилиний poly_a или poly_b содержит только сегмент:

      • используйте грубую силу, чтобы найти минимальное расстояние между ними и обновлением min_d соответственно.
    • иначе:

      • разделить обе полилинии poly_a и poly_b пополам, например:

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

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

      • сделайте перекрестное произведение обоих наборов, создайте 4 новых pair структуры данных и нажмите затем в очередь Вопрос:

в среднем случае сложность O(N * log N), в худшем случае может быть O (N2).

обновление: элемент алгоритм реализовано в Perl.


"стандартным" способом для таких задач является построение диаграммы Вороного геометрических объектов. Это можно сделать за время O (N Log N).

но построение таких диаграмм для линейных сегментов затруднено, и вы должны прибегнуть к готовым решениям, таким как в CGAL.