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