根据初始点的颜色值,在MATLAB中给Voronoi图上色

5

我有一个点矩阵,名为start_coord,其中包含它们的x和y坐标以及表示它们分类(1-5)的一列。例如,第一行看起来像[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 格式并保存为图片。

1个回答

5

使用 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

结果: 这里输入图片描述

感谢您的评论!您的解决方案使我能够绘制单个多边形,但不一定是整个 Voronoi 图。我尝试了在您的代码上进行迭代,并在同一图中绘制每个 i,但目前似乎会超时。我还找不到在 polyshape 中设置颜色的位置。Patch 有类似的功能,但需要不同的输入。 - Bryan Cannon
1
例如,使用 plot(polyshape(B),'FaceColor','green') 命令来设置颜色。 - L. Scott Johnson
2
要同时绘制多个图形,请使用 hold on - L. Scott Johnson
1
我已经添加了一个完整的示例,其中包含制作整个图形所需的详细信息。 - L. Scott Johnson
1
@BryanCannon:我还发现了一个名为VoronoiLimit的函数,它可以在边界处生成有用的顶点,而不是将它们全部设置为无穷大。不过我还没有测试过。链接已添加到上面的答案中。 - L. Scott Johnson
再次感谢您的帮助!您的方法绝对有效,也是实现可视化最简单的方式。由于我正在处理数千个无法同时绘制的多边形,所以我必须进行一些调整。将它们全部绘制到一个数组中以便稍后保存为图像的代码已经在编辑中了。 - Bryan Cannon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接