Раскрасьте диаграмму Вороного в MATLAB в соответствии со значениями цвета начальных точек

#matlab #colors #matlab-figure #voronoi

#matlab #Цвет #matlab-рисунок #вороной

Вопрос:

У меня есть матрица именованных точек start_coord , содержащая их координаты x и y, а также столбец, обозначающий их классификацию (1-5). Т.е. Первая строка выглядит как [75, 100, 4] .

Я вычислил диаграмму Вороного для этих данных, используя приведенный ниже код

[vc_x, vc_y] = voronoi(start_coord(:,1), start_coord(:,2));

Как бы я мог раскрасить результирующие полигоны по значению классификации точки, содержащейся в каждом полигоне, то есть в третьем столбце start_coord ?

ОТРЕДАКТИРУЙТЕ Для быстрого построения многоугольников по цвету ссылку на ответ в комментариях ниже, который помог сообщить об этом редактировании. Для получения полигонов Вороного для тысяч точек, записанных в массив, который можно сохранить в виде изображения, обратитесь к этому коду:

 new_map = zeros(sm_size(1), sm_size(2));
        start_coord = readmatrix(char(join([csv_path, '/', run_types(run), common_name_csv], "")));
        sc_size = size(start_coord);
        
        dt = delaunayTriangulation(start_coord(:,1:2));
        [V,R] = voronoiDiagram(dt);
                
        for i = 1:sc_size(1)
            A=V(R{i},:);
            B=A(any(~isinf(A),2),:); % omit points at infinity
            bw = poly2mask(B(:,1), B(:,2), sm_size(1), sm_size(2));
            new_map(bw == 1) = color_map(start_coord(i,3));
        end
  

new_map затем можно сохранить в виде массива или преобразовать в RGB и сохранить как изображение.

Ответ №1:

Используйте voronoiDiagram для получения полигонов.

 dt = delaunayTriangulation(start_coord(:,1:2));
[V,R] = voronoiDiagram(dt);
  

Тогда R{i} будет вершинами многоугольника из start_coord(i,:)
Поэтому установите цвет в цвет start_coord (i,3) и:

 A=V(R{i},:);
B=A(any(~isinf(A),2),:); % omit points at infinity
plot(polyshape(B));
  

Единственная проблема заключается в том, что бесконечные вершины обрезаются. Но, возможно, это позволит вам достаточно приблизиться к тому, что вы хотите. Если вам нужно заполнить до края, проверьте функцию VoronoiLimit (которую я не тестировал).

например:

 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];

X(:,3) = [ 1 2 1 3 1 2 2 2 2 3 3 3 3 3 3]';

ccode = ["red","green","blue"];

dt = delaunayTriangulation(X(:,1:2));
[V,R] = voronoiDiagram(dt);
figure
voronoi(X(:,1),X(:,2))
hold on
for i = 1:size(X,1)
    A=V(R{i},:);
    B=A(any(~isinf(A),2),:);
    if(size(B,1)>2)
        plot(polyshape(B),'FaceColor',ccode(X(i,3)));
    end
end
  

Результат:
введите описание изображения здесь

Комментарии:

1. Спасибо за комментарий! Ваше решение позволяет мне построить один многоугольник, но не обязательно всю вороноидиаграмму. Я попытался повторить ваш код и нанести каждый i на одну и ту же фигуру, хотя, похоже, время ожидания истекло. Я также не могу найти, где установить цвет в polyshape. Патч имеет что-то подобное, но требует другого ввода.

2. Раскрасьте, например, с помощью ` plot (polyshape (B), ‘FaceColor’, ‘green’)`.

3. Для одновременного построения нескольких диаграмм используйте hold on

4. Я добавил полный пример деталей, необходимых для создания целого графика.

5. @BryanCannon: Я также нашел функцию VoronoiLimit , которая создает полезные вершины на границе, а не устанавливает их все на бесконечность. Однако я этого не проверял. Ссылка добавлена к ответу выше.