【问题标题】:Gradient colors for faces of surface表面的渐变颜色
【发布时间】:2019-06-19 11:26:22
【问题描述】:

我有以下 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) 的面应为红色。对角线上的所有面都应该是黄色的。

你能帮我画这幅画吗?

【问题讨论】:

  • hmmm ...您有 3D 的顶点和面,但您在约束中仅指定 2 个坐标(“坐标为 (0,0) 的面应为绿色” ) ...您是在谈论X,Y 坐标吗?此外,vertices (=points) 具有唯一的坐标,faces 具有多个坐标(它们由多个点链接),因此如果您想要为faces 着色的标准,那么点坐标不是最佳选择。

标签: matlab 3d data-visualization matlab-figure surface


【解决方案1】:

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

因此,您只需设置正确的“颜色图”。那个必须与您的XY 数据具有相同的尺寸,并且对于每个数据点,您必须指定您选择的[R, G, B] 三元组,即[0, 1, 0] 用于[0, 0] 坐标,[1, 0, 0] 用于[1, 1] 坐标,以及这两者之间的一些“对角线”插值。

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

这是增强的代码:

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

输出如下:

希望有帮助!

【讨论】:

    【解决方案2】:

    一种方法如下:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多