Алгоритм связывания компонентов диаграммы Вороного

У меня есть программа, которая пока берет набор случайных точек, сайтов, и формирует вокруг этих точек соответствующую диаграмму Вороного, представленную в виде графа углов и ребер. Это также дает мне триангуляцию Делоне в качестве еще одного графа, в котором все сайты являются его узлами (хотя я не могу сказать, полезно ли это здесь).

До сих пор каждый реберный объект имел запись о том, с какими углами он инцидентен, и каждый угловой объект имел записи о том, какие ребра инцидентны ему и с какими другими углами он примыкает. Моя цель состоит в том, чтобы иметь возможность добавить в мой класс Edge два поля для двух соседних сайтов и расширить мой класс Site, добавив два поля: одно поле, содержащее набор углов, окружающих его, и другое для набора ребер. вокруг него.

Я думал, что можно было бы сгенерировать все отдельные полигоны, используя модифицированный поиск в ширину. Однако для этого потребуется просмотреть все сайты и выяснить, какой из них принадлежит какому полигону, и это будет O (n ^ 2), что не идеально. Есть ли более эффективный алгоритм, который может сделать то же самое?


person Bridgo    schedule 29.05.2014    source источник


Ответы (1)


У меня была аналогичная проблема. Если у вас есть все ребра, найдите середину линии и выполните цикл по списку всех сайтов. Отсортируйте список, и он даст 2 ближайших сайта. 2 ближайших сайта - это то, что вам нужно, потому что ребро всегда делит 2 сайта, кроме внешних краев. Затем сохраните список всех ребер и сайтов и повторяйте процесс до тех пор, пока ребер не останется. Подсказка заключается в том, что для внешних полигонов вам нужно добавить только один сайт. Наконец, он дает список всех полигонов.

person Gigamegs    schedule 30.05.2014
comment
Мое решение кажется O (n ^ 2), но я думаю, что ваше решение требует больше усилий, потому что многоугольник имеет 6..7 граней. Также нужно указать направление граней. Imo bfs - это O (n ^ 3..6), это работает? - person Gigamegs; 30.05.2014