曲面的渐变颜色

Gradient colors for faces of surface

我有以下 MATLAB 代码:

close all
clear all
clc
edges= linspace(0,1,10);
[X,Y] = meshgrid(edges);
Z=rand(10);
h= surf(X,Y,Z,'FaceColor','none')

我需要在此表面上绘制面孔。坐标为 (0,0) 的面应为绿色,坐标为 (1,1) 的面应为红色。对角线上的所有面都应该是黄色的。

你能帮我画一下吗?

一种方法如下:

edges= linspace(0,1,10);
[X,Y] = meshgrid(edges);
Z=rand(10);


% Fake some color data
cdata = zeros(size(Z));

for i = 1:size(cdata,1)
    cdata(i,i) = i; 
end

%make a suitable colormap

cm = ones(size(cdata,1), 3);
cm = cm .*[ 1 1 0 ] % everything yellow
cm(1, :) = [1 1 1] % except for 0
cm(2, :) = [1 0 0] % except for 1
cm(end, :) = [0 1 0] % except for 10

ax = axes();
h = surface(ax, X,Y,Z);
h.CData = cdata;
ax.Colormap = cm;

如果仔细查看 surf 命令,您会发现可以设置自定义 "colormap",然后使用它代替 Z 数据作为颜色指示剂。

因此,您只需设置适当的 "colormap"。该数据必须与您的 XY 数据具有相同的维度,并且对于每个数据点,您必须指定您选择的 [R, G, B] 三元组,即 [0, 1, 0] [0, 0] 坐标,[1, 0, 0] 用于 [1, 1] 坐标,以及这两者之间的一些 "diagonal" 插值。

幸运的是,你已经拥有了,看看你的 XY 数据!添加两者将为绿色通道提供那种 "diagonal" 插值。反之将给出正确的红色通道。 (缩放有点损坏,因为您的值大于 1.0,但这些值会 "clipped"。)

这是增强代码:

edges = linspace(0, 1, 10);
[X, Y] = meshgrid(edges);
Z = rand(10);
cm(:, :, 1) = (X + Y);          % Red channel
cm(:, :, 2) = 2 - cm(:, :, 1);  % Green channel
cm(:, :, 3) = zeros(size(X));   % Blue channel (empty)
h = surf(X, Y, Z, cm);          % No need for the FaceColor property

输出如下所示:

希望对您有所帮助!