根据初始点的颜色值在 MATLAB 中为 voronoi 图着色
Color a voronoi diagram in MATLAB according to the color values of the initial points
我有一个名为 start_coord
的点矩阵,其中包含它们的 x 和 y 坐标,以及一个表示它们的分类 (1-5) 的列。 IE。第一行看起来像 [75, 100, 4].
我使用下面的代码计算了此数据的 voronoi 图
[vc_x, vc_y] = voronoi(start_coord(:,1), start_coord(:,2));
我将如何根据每个多边形中包含的点的分类值(即 start_coord
中的第三列)为生成的多边形着色?
编辑
要按颜色快速绘制多边形,请参考下面评论中的答案,这有助于为这次编辑提供信息。要将数千个点的 voronoi 多边形写入可以保存为图像的数组,请参考以下代码:
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并保存为图像。
使用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
结果:
我有一个名为 start_coord
的点矩阵,其中包含它们的 x 和 y 坐标,以及一个表示它们的分类 (1-5) 的列。 IE。第一行看起来像 [75, 100, 4].
我使用下面的代码计算了此数据的 voronoi 图
[vc_x, vc_y] = voronoi(start_coord(:,1), start_coord(:,2));
我将如何根据每个多边形中包含的点的分类值(即 start_coord
中的第三列)为生成的多边形着色?
编辑 要按颜色快速绘制多边形,请参考下面评论中的答案,这有助于为这次编辑提供信息。要将数千个点的 voronoi 多边形写入可以保存为图像的数组,请参考以下代码:
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并保存为图像。
使用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
结果: