Градиентные цвета для граней поверхности - PullRequest
1 голос
/ 19 июня 2019

У меня есть следующий код для 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) должно быть красным.Все лица по диагонали должны быть желтыми.

Не могли бы вы помочь мне выполнить эту картину?

Ответы [ 2 ]

4 голосов
/ 19 июня 2019

Если вы присмотритесь к команде surf, вы увидите, что вы можете установить пользовательскую «карту цветов», которая затем используется вместо данных Z в качестве цветной индикатор.

Итак, вам просто нужно настроить правильную «карту цветов». Он должен иметь те же измерения, что и ваши данные X и Y, и для каждой точки данных вы должны указать триплет [R, G, B] по вашему выбору, то есть [0, 1, 0] для координаты [0, 0], [1, 0, 0] для [1, 1] координата и некоторая "диагональная" интерполяция между этими двумя.

К счастью, у вас уже есть это, посмотрите на ваши X и Y данные! Добавление обоих даст такую ​​«диагональную» интерполяцию для зеленого канала. Обратное из этого даст правильный красный канал. (Масштабирование немного искажено, поскольку у вас есть значения больше 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

Вывод выглядит так:

Output

Надеюсь, это поможет!

3 голосов
/ 19 июня 2019

Один из способов будет следующим:

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;

enter image description here

...