根据初始点的颜色值在MATLAB中对voronoi图进行着色

问题描述

我有一个名为start_coord的点矩阵,其中包含它们的x和y坐标,以及一列表示其分类的列(1-5)。即第一行看起来像[75,100,4]。

我已经使用下面的代码计算了该数据的伏洛诺伊图

[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(:,B(:,sm_size(1),sm_size(2));
            new_map(bw == 1) = color_map(start_coord(i,3));
        end

new_map然后可以保存为数组或转换为RGB并保存为图像。

解决方法

使用dt = delaunayTriangulation(start_coord(:,1:2)); [V,R] = voronoiDiagram(dt); 获取多边形。

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

则R {i}将是start_coord(i,:)中多边形的顶点 因此,将颜色设置为start_coord(i,3)的颜色,然后:

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(:,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),:);
    if(size(B,1)>2)
        plot(polyshape(B),'FaceColor',ccode(X(i,3)));
    end
end

唯一的麻烦是无限远处的顶点被切掉。但这也许会使您足够接近所需的内容。如果您需要填充边缘,请查看VoronoiLimit函数(我尚未测试)。

例如:

{{1}}

结果: enter image description here