Преобразование ребер вороного в многоугольники

#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. Это может сработать, я попробую и вернусь с результатами 🙂