Рассчитать Вороного вокруг многоугольника - PullRequest
11 голосов
/ 19 августа 2011

Мне нужно сгенерировать диаграмму Вороного вокруг вогнутого (невыпуклого) внутри многоугольника.Я искал методы онлайн, но я не смог понять, как это сделать.По сути, я генерирую выпуклую оболочку точек, вычисляю двойные точки и строю сеть ребер между этими точками.Однако при встрече с краями внутреннего многоугольника он должен выглядеть как край фигуры, как выпуклая оболочка.Таким образом, выполнив это и обрезав все ребра на границах, я должен получить диаграмму Вороного, которая имеет хорошие ребра на границах внутреннего многоугольника и не имеет ячеек, которые находятся по обе стороны от внутреннего многоугольника.

Позвольте мне привести пример:

enter image description here

Проблема заключается в том, что ячейки пересекают внутренние края многоугольника, и визуальная связь между структурой ячеек и многоугольником отсутствует.shape.

Кто-нибудь знает, как решить эту проблему?Есть какой-то алгоритм, который уже делает это или приближается к тому, чего я пытаюсь достичь?

Большое спасибо за любой ввод!

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

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

Посмотрите на пакет треугольника здесь , так какссылка для этого типа подхода.По моему опыту, это быстрая и надежная библиотека, хотя она написана на c, а не java.

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

РЕДАКТИРОВАТЬ: похоже, вы можететакже непосредственно сформируйте диаграмму Вороного для общих отрезков, посмотрите библиотеку VRONI, здесь .Что касается вашего комментария - я не уверен, что вы всегда можете рассчитывать на однородную диаграмму Вороного, которая также соответствует общей многоугольной границе.Я ожидал бы, что форма многоугольной границы наложит максимальный размер на граничные ячейки Вороного.

Надеюсь, это поможет.

1 голос
/ 29 августа 2011

Очевидно, что вам нужно сгенерировать диаграмму Вороного с учетом ограничений большого многоугольника.Несмотря на то, что вы называете его полигоном, я заметил, что у вашего примера диаграммы есть сплайновые ребра.Давайте забудем об этом сейчас.

Что вы хотите сделать, это убедиться, что вы начинаете с содержащего многоугольника (сгенерированного вами или из другого источника), имеющего ребра довольно равной длины;фактор дисперсии сделал бы это более естественным.Вероятно, я бы выбрал дисперсию в 10-20%.

Теперь, когда ваш содержащийся многоугольник ограничен отрезками линий приблизительно равной длины, у вас есть основа, с которой можно начать генерировать диаграмму Вороного.Для каждого ребра в вашем контейнере:

  • Определите нормаль ребра (линия perp, выступающая внутрь от центра этого сегмента).
  • Используйте нормаль ребра в качестве скользящей шкалы, на которой нужно разместитьновый узел Вороного узла.Расстояние от самого края будет зависеть от того, каким должен быть ваш средний «диаметр» ячейки Вороного, если бы все они были взяты в виде кругов.В вашем примере это выглядит примерно на 30 пикселей (или каков бы ни был эквивалент в ваших мировых единицах).Опять же, вы должны применить к этому коэффициент дисперсии, чтобы не каждый центр ячейки располагался на равном расстоянии от края его источника.
  • Создайте ячейку Вороного для вновь созданного центра.
  • Сохраните ячейку Вороногоисходная точка в списке.

По мере того, как вы постепенно генерируете каждую точку, вы должны начать видеть, что алгоритм подразделяет каждую выпуклую "составляющую область" вашего вогнутого контейнера в радиальном направлении.

Возможно, вам интереснодля чего этот списокНу, очевидно, вы еще не закончили, вы сгенерировали только часть общего тесселяции Вороного, которую вы хотите.После того как вы создали эти «граничные» ячейки вашего вогнутого пространства, вы не хотите, чтобы новые ячейки создавались ближе к границе, чем уже есть граничные ячейки, вы хотите, чтобы они были только внутри этой области.Поддерживая список исходных точек граничных ячеек, вы можете гарантировать, что любые дополнительные точки, которые вы создаете, находятся внутри этой области.Это немного похоже на взятие внутренней суммы Минковского, чтобы убедиться, что у вас есть буферная зона.Теперь вы можете рандомизировать оставшиеся ячейки в этом производном вогнутом пространстве до завершения.

(Предостережение emptor: вам нужно быть осторожным с этим предыдущим шагом. Если какие-либо области «прохода» слишком узкие, тограницы этого производного пространства будут перекрываться, у вас будет непростой многоугольник, и вы можете оказаться в неправильных местах, несмотря на ваши усилия. Решение состоит в том, чтобы обеспечить максимальное расстояние от краевбольше половины вашей минимальной ширины прохода ... или используйте другие геометрические средства, в том числе суммирование Минковского, чтобы убедиться, что вы не получите вырожденный многоугольник. Вполне возможно, что вы закончите с мультиполигоном,то есть фрагменты.)

Я сам еще не применял этот метод, но, хотя, безусловно, будут ошибки, с которыми я буду работать, я думаю, что общая идея поможет вам начать в правильном направлении.

0 голосов
/ 24 декабря 2011

Ищите бумагу под названием:

" Эффективное вычисление непрерывных скелетов " от Киркпатрик, Дэвид G , написано в 1979 году.

Вот тезисы:

Представлен алгоритм O (n lgn) для построения скелетов. произвольных n-линейных многоугольников. Этот алгоритм основан на O (n lgn) алгоритм построения обобщенного Вороного диаграммы (наше обобщение заменяет наборы точек на наборы линий сегменты ограничены, чтобы пересекаться только в конечных точках). Обобщенный Алгоритм диаграммы Вороного использует линейный алгоритм времени для объединение двух произвольных (стандартных) диаграмм Вороного.

" Наборы отрезков линий ограничены для пересечения только в конечных точках " - вогнутый многоугольник, который вы описываете.

...