Построение двух изоповерхностных объектов на одной фигуре с разными цветными картами - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь нарисовать два прямоугольника на одной фигуре в MATLAB, используя функцию 3D isosurface.


Определение ячеек

Таким образом, следующий код предназначен для определения "внутренней" области двух разных ящиков со значением 1.

[x, y, z] = meshgrid (-3:0.1:3, -3:0.1:3, -3:0.1:3);
BoxA = (x(:) >= -2 & x(:) <= 1) & (y(:) >= -2 & y(:) <= 1) & (z(:) >= -2 & z(:) <= 1);
BoxA = reshape(BoxA, size(x));
BoxB = (x(:) >= -1 & x(:) <= 2) & (y(:) >= -1 & y(:) <= 2) & (z(:) >= -1 & z(:) <= 2);
BoxB = reshape(BoxB, size(x));

Сюжет

А вот код для рисования вышеприведенных прямоугольников на одной фигуре.

figure; hold on;
colormap('autumn');
isosurface(BoxA,0.5);
colormap('winter');
isosurface(BoxB,0.5);
legend('BoxA', 'BoxB');
alpha(0.3); hold off;

Я определил две разные цветовые карты autumn и winter, но я получил только две неоднозначные коробки с одинаковой цветовой картой winter.

Некоторые могут подумать isosurface является излишним для рисования 3D-бокса, но я также хотел бы сделать аналогичную работу для 3D-эллипсоидов.

Кто-нибудь может дать какой-нибудь совет?

1 Ответ

0 голосов
/ 02 февраля 2019

Функция colormap применяет цветную карту к рисунку (все окно).Так как несколько лет назад стало возможным применять разные цветовые карты к каждой оси в окне, явно предоставив функции colormap дескриптор оси.Но невозможно назначить цветовую карту отдельным компонентам в осях.

Каждому многоугольнику в патче (или фактически каждой вершине) можно назначить свой собственный цвет.Также можно назначить один цвет всем полигонам.Это, вероятно, то, что вам нужно.

Это один из способов изменения созданных вами патчей:

figure; hold on;

h1 = patch(isosurface(BoxA,0.5));
h1.EdgeColor = 'none';
h1.FaceColor = [1,0,0];
h1.FaceAlpha = 0.7;

h2 = patch(isosurface(BoxB,0.5));
h2.EdgeColor = 'none';
h2.FaceColor = [0,1,0];
h2.FaceAlpha = 0.5;

legend('BoxA', 'BoxB');

Вместо использования isosurface без выходного аргумента (который создает патчобъект), мы используем его с одним выходным аргументом.Этот вывод является информацией для рисования объекта патча.Мы передаем это в функцию patch, которая в свою очередь возвращает дескриптор объекта патча.Нам нужен этот дескриптор, чтобы изменить патч.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...