Разный цвет в верхней и нижней части поверхности в Matlab

#matlab #graphics #3d #matlab-figure

#matlab #графика #3D #matlab-рисунок

Вопрос:

Я хочу построить функцию в Matlab, но с другим цветом сверху и снизу поверхности. Мой код:

 close all;
clear all;
[X, Y] = meshgrid(-10:.45:10,-10:.45:10)
x=X(1,:)'; %'
y=Y(:,1);
N=length(x(:,1))
f = -1.*ones(size(X));

for i = 1:N
    for j=1:N
        if (x(i)~=0 amp;amp; y(j)~=0) 
            f(i,j) = (x(i).^2- y(j).^2)./(x(i).^2 y(j).^2);
        end
    end
end
figure(1)
surf(X,Y,f, 'FaceColor','white','EdgeColor','blue', 'LineWidth',.5)
view(-61,41)
title('Funktion f(x,y)', 'FontSize',12)
xlabel('x','FontSize',12)
ylabel('y', 'FontSize',12)
grid off
  

http://i.stack.imgur.com/DdMDX.jpg

Этот пример иллюстрирует, чего я добиваюсь, с точки зрения разного цвета верха / низа (однако, это было сделано с помощью gnuplot):

пример gnuplot

Ответ №1:

Следующее не совсем то, что вы хотите, но это может помочь:

 h = surf(X,Y,f, 'FaceColor','blue','EdgeColor','none'); %// no edges
lightangle(-30, 80) %// change values as needed
set(h,'DiffuseStrength',.9) %// change value as needed
set(h,'AmbientStrength',.3) %// change value as needed
  

введите описание изображения здесь

Как вы видите, в этом типе представления ребра не отображаются; скорее, форма функции раскрывается по цветам граней. В результате может быть лучше (если это возможно в вашей проблеме) использовать более точную выборку. Конечно, поскольку 0 является проблемным значением для вашей функции, его следует избегать, как это делает ваша исходная выборка ( linspace при четном количестве точек это также достигается). Например, с

 [X, Y] = meshgrid(linspace(-10,10,500),linspace(-10,10,500));
  

вы получаете более привлекательную картинку

введите описание изображения здесь

Комментарии:

1. Большое вам спасибо. Но возможно ли это с помощью сетки, именно в GNUplot?

2. Извините, я никогда не использовал GNUplot. Чтобы сохранить сетку в Matlab, измените первую строку на что-то вроде h = surf(X,Y,f, 'FaceColor','blue','EdgeColor','black');