Jacob
эй, вы нашли интересный способ генерации этой диаграммы Вороного, хотя она не так эффективна.
Во-первых, менее важная проблема: границы разной толщины, которые вы получаете, эти формы бабочек, фактически являются областью между двумя ветвями гиперболы. Именно гипербола, определяемая уравнением | da - db | = 4. Чтобы получить толстую линию вместо этого, вы должны изменить этот критерий и заменить его расстоянием до биссектрисы двух ближайших соседей, пусть A и B; используя векторное исчисление, | PA.AB / || AB || - || AB || / 2 | <4. </p>
Более важная проблема: есть два хорошо известных эффективных решения для построения диаграммы Вороного набора точек: алгоритм развертки Fortune (как упомянуто templatetypedef) и решения «Разделяй и властвуй» от Preparata & Shamos. Оба работают в оптимальное время O (N.Lg (N)) для N точек, но их не так просто реализовать.
Этот алгоритм построит диаграмму Вороного в виде набора отрезков и полулиний. Чек http://en.wikipedia.org/wiki/Voronoi_diagram.
В этой статье «Примитивы для манипулирования общими подразделениями и вычисления Вороного» описываются оба алгоритма с использованием несколько высокоуровневой структуры, заботящейся обо всех деталях реализации; статья сложная, но алгоритмы реализуемые.
Вы также можете взглянуть на «Простой итеративный алгоритм для плоской диаграммы Вороного», который я никогда не пробовал.
Совершенно другой подход заключается в непосредственном построении карты расстояний из заданных точек, например, с помощью алгоритма Дейкстры: начиная с заданных точек, вы увеличиваете границу области на заданном расстоянии от каждой точки и прекращаете расти когда две границы встречаются. [Требуются дополнительные пояснения.] См. http://1.bp.blogspot.com/-O6rXggLa9fE/TnAwz4f9hXI/AAAAAAAAAPk/0vrqEKRPVIw/s1600/distmap-20-seed4-fin.jpg
Другой хорошей отправной точкой (для эффективного вычисления карты расстояний) может быть «Общий алгоритм вычисления преобразований расстояния в линейном времени».