1

我想知道是否有一种简单的方法可以使用 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 值向量。

我的问题是,是否可以使用 patch 来创建这些多边形,并将初始颜色映射到这些多边形上,然后能够使用 set 命令(或类似的命令)输入另一个 mx1 颜色向量来改变颜色使用初始着色的原始映射一次所有这些多边形。

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

让我知道是否有什么我可以做的更清楚的,谢谢!

4

2 回答 2

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]);
于 2012-10-27T10:07:36.177 回答
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 来表示无限大且无界的补丁,所以有界的补丁,我可以为它们着色。谢谢您的帮助!

于 2012-10-28T01:21:29.950 回答