#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
, которая создает полезные вершины на границе, а не устанавливает их все на бесконечность. Однако я этого не проверял. Ссылка добавлена к ответу выше.