Voronoi Diagrams改变面部颜色

时间:2012-10-27 06:16:56

标签: matlab voronoi

我想知道是否有一种简单的方法可以使用patch命令更改Voronoi图的颜色。事实上,似乎必须有一个相对简单的方法,因为我使用set命令来改变颜色条的限制,这样我可以在绘制不同的Voronoi图时标准化颜色。

for i = 1:length(p)
if all(p{i}~=1)   % If at least one of the indices is 1, 
                  % then it is an open region and we can't 
                  % patch that.
patch(v(p{i},1),v(p{i},2),log10(Color(i)))**; % use color i.
set(gca, 'CLim', [0 7]);
colorbar
end
end

patch命令用于从voronoin命令获取输出信息,然后为凸多边形创建面。重要的部分是这些补丁的着色。正如您所看到的那样,这是我传递给patch命令的第三个输入参数,并且是一个mx1值向量。

我的问题是,是否可以使用补丁来创建那些初始颜色映射到这些多边形的多边形,然后能够使用set命令(或类似的东西)来输入另一个mx1颜色矢量来改变使用初始着色的原始映射,同时显示所有这些多边形的颜色。

我以前的方式是非常圆的方法,而且非常耗时。因为每种颜色必须与其特定的多边形相对应,所以每次我想要一种新颜色时我都必须重新创建所有多边形。我希望在创建多边形后,使用新的颜色矢量更容易地改变颜色。

如果有任何我可以做的事情让我更清楚,请告诉我,谢谢!

2 个答案:

答案 0 :(得分:1)

我不完全确定这是否是您所要求的,但可能是:

% Is this how you generate your Voronoi diagram?
x = gallery('uniformdata',[1 10],0);
y = gallery('uniformdata',[1 10],1);
dt = DelaunayTri(x(:),y(:));
v = voronoiDiagram(dt);

% Original colors of your Voronoi patches (mx3 matrix)
origColors = rand(numel(p), 3);

% To store handles to the generated patches
pHandle = nan(1, numel(p));

for i = 1:numel(p)
    if all(p{i}~=1)
        pHandle(i) = patch(v(p{i},1), v(p{i},2), colors(i)); 
    end
end
set(gca, 'CLim', [0 7]);

% New colors for the patches (mx3 matrix)
newColors = rand(numel(p), 3);

% Recolor the closed regions
closedIdx = find(~isnan(patchHandle));
arrayfun(@(i) set(pHandle(i), 'FaceColor', colors(i,:)), closedIdx);
set(gca, 'CLim', [0 7]);

答案 1 :(得分:1)

x = [3 6 9 1 2 10 2 2 5 8]';
y = [5 10 15 3 5 12 5 8 10 7]';

[v,p] = voronoin([x,y]);

% Original colors of your Voronoi patches (mx3 matrix)
colors = [10 9 NaN NaN 2 NaN NaN 1 NaN NaN]';

% To store handles to the generated patches
pHandle = nan(1, numel(p));

for i = 1:numel(p)
if all(p{i}~=1)
    pHandle(i) = patch(v(p{i},1), v(p{i},2), colors(i)); 
end
end
colorbar 
% New colors for the patches (mx3 matrix)
colors = [1 2 NaN NaN 9 NaN NaN 10 NaN NaN]';

% Recolor the closed regions
closedIdx = find(~isnan(pHandle));
arrayfun(@(i) set(pHandle(i),   'FaceColor','flat','FaceVertexCData',colors(i,:),'CDataMapping','scaled'),closedIdx);

我不得不使用NaN的补丁进入无限远并且没有界限,所以那些有界的,我可以给它们着色。谢谢您的帮助!