Расстояние между двумя полилиниями
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.