exponenta event banner

Диаграммы Вороного

Диаграмма Вороного дискретного набора точек X разлагает пространство вокруг каждой точки X(i) в область влияния R{i}. Эта декомпозиция имеет свойство, которое является произвольной точкой P в пределах региона R{i} ближе к точке i чем любой другой момент. Область влияния называется областью Вороного, а совокупность всех областей Вороного - диаграммой Вороного.

Диаграмма Вороного является N-D геометрической конструкцией, но большинство практических применений находятся в 2-D и 3-D пространстве. Свойства диаграммы Вороного лучше всего понять на примере.

График 2-D диаграмма Вороного и триангуляция Делоне

В этом примере показана диаграмма Вороного и триангуляция Делоне на одном и том же графике 2-D.

Используйте 2-D voronoi функция для построения диаграммы воронки для набора точек.

figure()
X = [-1.5 3.2; 1.8 3.3; -3.7 1.5; -1.5 1.3; ...
      0.8 1.2; 3.3 1.5; -4.0 -1.0;-2.3 -0.7; ...
      0 -0.5; 2.0 -1.5; 3.7 -0.8; -3.5 -2.9; ...
     -0.9 -3.9; 2.0 -3.5; 3.5 -2.25];
 
voronoi(X(:,1),X(:,2))

% Assign labels to the points.
nump = size(X,1);
plabels = arrayfun(@(n) {sprintf('X%d', n)}, (1:nump)');
hold on
Hpl = text(X(:,1), X(:,2), plabels, 'FontWeight', ...
      'bold', 'HorizontalAlignment','center', ...
      'BackgroundColor', 'none');

% Add a query point, P, at (0, -1.5).
P = [0 -1];
plot(P(1),P(2), '*r');
text(P(1), P(2), 'P', 'FontWeight', 'bold', ...
     'HorizontalAlignment','center', ...
     'BackgroundColor', 'none');
hold off

Figure contains an axes. The axes contains 19 objects of type line, text.

Обратите внимание, что P ближе к X9 чем в любой другой момент в X, что верно для любой точки P в пределах области, ограничивающей X9.

Диаграмма Вороного набора точек X тесно связан с триангуляцией Делоне X. Чтобы увидеть эту связь, создайте триангуляцию Делоне набора точек X и наложить график триангуляции на диаграмму Вороного.

dt = delaunayTriangulation(X);
hold on
triplot(dt,'-r');
hold off

Figure contains an axes. The axes contains 20 objects of type line, text.

На графике видно, что область Вороного связана с точкой X9 определяется перпендикулярными биссекторами кромок Делоне, присоединенных к X9. Также вершины рёбер Вороного расположены в циркумцентрах треугольников Делоне. Эти связи можно проиллюстрировать, построив график циркумцентра треугольника {| X9 |, | X4 |, | X8 |}.

Чтобы найти индекс этого треугольника, запросите триангуляцию. Треугольник содержит расположение (-1, 0).

tidx = pointLocation(dt,-1,0);

Теперь найдите циркумцентр этого треугольника и постройте его зеленым цветом.

cc = circumcenter(dt,tidx);
hold on
plot(cc(1),cc(2),'*g');
hold off

Figure contains an axes. The axes contains 21 objects of type line, text.

Триангуляция Делоне и диаграмма Вороного являются геометрическими дуалами друг друга. Можно вычислить диаграмму Вороного из триангуляции Делоне и наоборот.

Обратите внимание, что Вороныйские районы, связанные с точками на выпуклом корпусе, являются неограниченными (например, Воронойский район, связанный с X13). Края в этой области «заканчиваются» на бесконечности. Края Вороного, которые Делоне пополам (X13, X12) и (X13, X14) простираются до бесконечности. Хотя диаграмма Вороного обеспечивает разложение ближайшего соседа пространства вокруг каждой точки в наборе, она не поддерживает непосредственно запросы ближайшего соседа. Однако геометрические конструкции, используемые для вычисления диаграммы Вороного, также используются для выполнения поиска ближайшего соседа.

Вычисление диаграммы Вороного

Этот пример показывает, как вычислить 2-ю и 3D диаграмму Voronoi.

MATLAB ® предоставляет функции для построения диаграммы Вороного в 2-D и вычисления топологии диаграммы Вороного в N-D. На практике вычисление Вороного нецелесообразно в измерениях, выходящих за рамки 6-D для наборов данных от умеренных до больших, из-за экспоненциального роста требуемой памяти.

voronoi функция графика строит график Вороного для набора точек в 2-D пространстве. В MATLAB существует два способа вычисления топологии диаграммы Вороного набора точек:

voronoin функция поддерживает вычисление топологии Вороного для дискретных точек в N-D (N ≥ 2). voronoiDiagram способ поддерживает вычисление топологии Вороного для дискретных точек 2-D или 3-D.

voronoiDiagram метод рекомендуется для 2-D или 3-D вычислений топологии, поскольку он является более надежным и обеспечивает лучшую производительность для больших наборов данных. Этот метод поддерживает инкрементную вставку и удаление точек и дополнительных запросов, таких как поиск ближайшей соседней точки.

voronoin функции и voronoiDiagram способ представляет топологию диаграммы Вороного с использованием матричного формата. Дополнительные сведения об этой структуре данных см. в разделе Формат матрицы триангуляции.

Учитывая набор точек, X, получить топологию диаграммы Вороного следующим образом:

  • Использование voronoin функция

[V,R] = voronoin(X)

  • Использование voronoiDiagram метод

dt = delaunayTriangulation(X);

[V,R] = voronoiDiagram(dt)

V - матрица, представляющая координаты вершин Вороного (вершины являются конечными точками рёбер Вороного). По соглашению первая вершина в V - бесконечная вершина. R - длина массива векторных ячеек size(X,1), представляющий область Вороного, связанную с каждой точкой. Отсюда и связанный с пунктом Вороной район X(iявляется R{i}.

Определение и построение графика воронки для набора точек

X = [-1.5 3.2; 1.8 3.3; -3.7 1.5; -1.5 1.3; 0.8 1.2; ...
      3.3 1.5; -4.0 -1.0; -2.3 -0.7; 0 -0.5; 2.0 -1.5; ...
      3.7 -0.8; -3.5 -2.9; -0.9 -3.9; 2.0 -3.5; 3.5 -2.25];
[VX,VY] = voronoi(X(:,1),X(:,2));
h = plot(VX,VY,'-b',X(:,1),X(:,2),'.r');
xlim([-4,4])
ylim([-4,4])

% Assign labels to the points X.
nump = size(X,1);
plabels = arrayfun(@(n) {sprintf('X%d', n)}, (1:nump)');
hold on
Hpl = text(X(:,1), X(:,2)+0.2, plabels, 'color', 'r', ...
      'FontWeight', 'bold', 'HorizontalAlignment',...
      'center', 'BackgroundColor', 'none');
  
% Compute the Voronoi diagram.
dt = delaunayTriangulation(X);
[V,R] = voronoiDiagram(dt);


% Assign labels to the Voronoi vertices V.
% By convention the first vertex is at infinity.
numv = size(V,1);
vlabels = arrayfun(@(n) {sprintf('V%d', n)}, (2:numv)');
hold on
Hpl = text(V(2:end,1), V(2:end,2)+.2, vlabels, ...
      'FontWeight', 'bold', 'HorizontalAlignment',...
      'center', 'BackgroundColor', 'none');
hold off

Figure contains an axes. The axes contains 66 objects of type line, text.

R{9} дает индексы вершин Вороного, связанных с площадкой точки X9.

R{9}
ans = 1×5

     5     7    17    12     9

Индексы вершин Вороного являются индексами относительно V массив.

Аналогично, R{4} дает индексы вершин Вороного, связанных с площадкой точки X4.

R{4}
ans = 1×5

     5     9    11     8     6

В 3-D область Вороного является выпуклым многогранником, синтаксис создания диаграммы Вороного аналогичен. Однако геометрия Вороного района более сложна. Следующий пример иллюстрирует создание 3D диаграммы Voronoi и нанесение единственного региона.

Создайте выборку из 25 точек в 3-D пространстве и вычислите топологию диаграммы Вороного для этого набора точек.

rng('default')
X = -3 + 6.*rand([25 3]);
dt = delaunayTriangulation(X);

Вычислите топологию диаграммы Вороного.

[V,R] = voronoiDiagram(dt);

Найдите точку, ближайшую к началу координат, и постройте график области Вороного, связанной с этой точкой.

tid = nearestNeighbor(dt,0,0,0);
XR10 = V(R{tid},:);
K = convhull(XR10);
defaultFaceColor  = [0.6875 0.8750 0.8984];
trisurf(K, XR10(:,1) ,XR10(:,2) ,XR10(:,3) , ...
        'FaceColor', defaultFaceColor, 'FaceAlpha',0.8)
title('3-D Voronoi Region')

Figure contains an axes. The axes with title 3-D Voronoi Region contains an object of type patch.

Связанные темы