#algorithm #graph-theory #voronoi
Вопрос:
В настоящее время я пытаюсь получить многоугольники Вороного, разделяющие плоскость определенного размера (например, 1000×1000 с 500 случайными точками).
Для этой цели я использовал алгоритм триангуляции Делоне — Боуэра Уотсона. Благодаря этому я могу генерировать точки и правильно соединять ребра, включенные в диаграмму Вороного. К сожалению, в моем случае мне нужен список полигонов (каждый из которых содержит список своих ребер).
Я попытался создать наивный алгоритм, который бы брал ребра одно за другим и искал следующие, чтобы создать окончательный многоугольник и так далее — к сожалению, безуспешно. Я также думал о том, чтобы взять вершины треугольников и создать круг до тех пор, пока не будет сформирован многоугольник (из существующих ребер), но я не уверен, что это хорошее решение?
Есть ли какой-нибудь способ сделать это? Или мне следует использовать другой алгоритм для получения списка полигонов Вороного? Я не нашел подходящего решения этой проблемы в Интернете, если оно есть, буду благодарен за ссылку
Комментарии:
1. Итак, у вас уже есть ребра (отрезки линий), вам просто нужно вывести полигоны в виде контуров?
2. @RBarryYoung Да, у меня уже есть список ребер, и мне нужно преобразовать его в список полигонов
3. Я бы предложил создать список ребер с двойным подключением (DCEL), используя алгоритм, описанный здесь .
Ответ №1:
- Выберите E произвольное ребро
- Добавьте вершины в E в многоугольник
- Выберите точку P немного в стороне от E
- Если точка внутри плоскости
- Выберите одну вершину выбранного ребра
- Выберите E2 новое ребро из вершины с наименьшим углом со стороны с точкой P
- Добавьте вторую вершину в E2 в многоугольник
- Повторяйте последние два шага, пока не достигнете другой вершины в E
- Добавьте полигон в решение, если он еще не включен
- Повторите с точкой на другой стороне края
- Повторяйте до тех пор, пока все края не будут обработаны
Комментарии:
1. У меня проблема с «Выберите E2 ближайшее новое ребро от вершины до P», которое, если ближайшее ребро «неправильное», я имею в виду, что, если у нас есть два ребра из точки P, одно правильное (ведет к правильному многоугольнику), а другое ведет нас в неправильном направлении. В некоторых случаях я могу пройти через всю плоскость и создать один гигантский многоугольник или даже застрять. Как определить, какой край правильный?
2. Если ребер несколько, выберите то, которое ближе всего к P.
3. Лучшим тестом был бы наименьший угол между E и E2
4. Это может сработать, я попробую и вернусь с результатами 🙂