эталонный алгоритм для взвешенных диаграмм Вороного?

Может ли кто-нибудь указать мне на эталонную реализацию о том, как построить (мультипликативно и / или аддитивно) взвешенную диаграмму Вороного, которая предпочтительно основана на алгоритме Вороного Фортуны?

Моя цель: учитывая набор точек (каждая точка имеет вес) и набор граничных ребер (обычно прямоугольник), я хочу построить взвешенную диаграмму Вороного, используя либо python, либо processing.org- рамки. Вот пример.

Над чем я работал до сих пор: до сих пор я реализовал алгоритм Fortune, а также "центроидную тесселяцию вороного", представленную в Статья Майкла Бальцера. Алгоритм 3 указывает, как нужно отрегулировать веса, однако, когда я реализую это, моя геометрия больше не работает. Чтобы исправить это, алгоритм развертки линии должен быть обновлен, чтобы учесть веса, но мне пока не удалось это сделать. Поэтому мне хотелось бы посмотреть, как другие люди решили эту проблему.


person Marco Pashkov    schedule 15.04.2013    source источник


Ответы (4)


Для аддитивно взвешенной диаграммы Вороного: Помните, что диаграмма мощности в размерности n есть только (n невзвешенная) диаграмма Вороного в размерности n + 1.

Для этого просто вспомните, что диаграмма Вороного набора точек инвариантна, если вы добавляете любую константу к координатам, и что взвешенная диаграмма Вороного, таким образом, может быть записана как невзвешенная диаграмма Вороного с использованием координат, например, в 2D, поднятая до 3D:
(x_i, y_i, sqrt (C - w_i))
где w_i - вес начального числа, а C - любая произвольно большая константа (на практике достаточно малая такая, что C-w_i является положительный).
Как только ваша диаграмма будет вычислена, просто отбросьте последний компонент.

Итак, по сути, вам нужно только найти библиотеку, которая способна обрабатывать диаграммы Вороного в размерности n + 1 по сравнению с вашей проблемой. CGAL может это сделать. Это также делает реализацию чрезвычайно простой.

person nbonneel    schedule 16.04.2013

Это непростое вычисление, но оно доступно в CGAL. См. страницы руководства здесь.


Из руководства CGAL
См. также Проект эффективной вычислительной геометрии, который использует и поддерживает CGAL:
 Моник

person Joseph O'Rourke    schedule 16.04.2013

Существует мало "готового" открытого исходного кода для случая, когда расстояния до центров взвешиваются с множительным коэффициентом. Насколько мне известно, ни один из текущих пакетов CGAL не охватывает этот случай.

Красиво красочный веб-сайт Такаши Охьямы предоставляет java-реализации http://www.nirarebakun.com/voro/emwvoro.html до 100 точек с помощью ПРОСТОГО алгоритма (евклидово и манхэттенское расстояния). Также есть документ, описывающий этот простой алгоритм пересечения и примерную реализацию в течение O (n ^ 3) времени в качестве плагина к TerraView. Однако я не могу найти источник этого плагина в репозитории TerraView / TerraLib: http://www.geoinfo.info/geoinfo2011/papers/mauricio1.pdf

Ауренхаммер и Эдельсбруннер описывают оптимальный алгоритм времени n ^ 2, но мне неизвестен его доступный код.

person ree2k    schedule 07.01.2018

Если вам удобно копаться в Octave, вы можете сослаться на код, предоставленный в их библиотеке.

person Nolo    schedule 15.04.2013
comment
Кроме того, библиотека часто предоставляет внешние ресурсы для конкретных алгоритмов или реализаций, которые могут быть полезны. - person Nolo; 16.04.2013
comment
Спасибо за ваш ответ! Я просмотрел документацию по Octave, но к сожалению, я не видел ни одного API, описывающего, как я могу построить взвешенный вороной. Кажется, он поддерживает только общие диаграммы Вороного, например, для анализ ближайшего соседа. Я что-то пропустил? - person Marco Pashkov; 16.04.2013