【问题标题】:Color a voronoi diagram in MATLAB according to the color values of the initial points根据初始点的颜色值在 MATLAB 中为 voronoi 图着色
【发布时间】:2021-02-11 01:36:08
【问题描述】:

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

我使用下面的代码计算了这些数据的 voronoi 图

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

如何通过每个多边形中包含的点的分类值(即start_coord 中的第三列)为生成的多边形着色?

编辑 要按颜色快速绘制多边形,请参考下面 cmets 中的答案,这有助于为编辑提供信息。要获取将数千个点写入可保存为图像的数组的 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 并保存为图像。

【问题讨论】:

    标签: matlab colors matlab-figure voronoi


    【解决方案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
    

    结果:

    【讨论】:

    • 感谢您的评论!您的解决方案使我可以绘制单个多边形,但不一定绘制整个 voronoiDiagram。我已经尝试迭代您的代码并将每个 i 绘制在同一个数字上,尽管这似乎超时了 atm。我似乎也找不到在 polyshape 中设置颜色的位置。 Patch 有类似的东西,但需要不同的输入。
    • 以 `plot(polyshape(B),'FaceColor','green')` 为例。
    • 一次绘制多个,使用hold on
    • 我添加了一个完整的例子,说明了制作整个情节所需的细节。
    • @BryanCannon :我还发现了一个函数VoronoiLimit,它可以在边界处创建有用的顶点,而不是将它们全部设置为无穷大。不过,我还没有测试过。链接添加到上面的答案。
    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 2014-07-02
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2012-04-07
    • 2022-01-10
    相关资源
    最近更新 更多