Вы можете добавить дополнительные поверхности, создав новый набор матриц для перехода к surf
, с несколькими различными параметрами, основанными на том, как вы хотите, чтобы результаты выглядели ...
Вариант № 1: заполнить стороны, один поверхностный объект:
Если вы хотите просто заполнить стороны, вы можете добавить новую строку и столбец на каждой стороне вашей матрицы следующим образом:
[R, C] = size(Z);
Xfill = [nan X(1, :) nan; X(:, [1 1:C C]); nan X(R, :) nan];
Yfill = [nan Y(1, :) nan; Y(:, [1 1:C C]); nan Y(R, :) nan];
Zfill = [nan zeros(1, C) nan; zeros(R, 1) Z zeros(R, 1); nan zeros(1, C) nan];
surf(Xfill, Yfill, Zfill);
view(-120, 30);
Это позволяет вам наносить на поверхность и стороны с помощью одного вызова surf
, с таким результатом:
![enter image description here](https://i.stack.imgur.com/5A6XB.png)
Вариант № 2: заполнить стороны и дно одним поверхностным объектом:
Если вы также хотите заполнить нижнюю часть фигуры, вы можете обернуть поверхность вокруг и под себя, добавив новые столбцы, а затем добавить новую строку сверху и снизу, чтобы закрыть концы:
[R, C] = size(Z);
Xfill = [X(1, 1:C) nan(1, C+1); ... % Close top
X flip(X, 2) X(:, 1); ... % Flip data and connect to other side
X(R, 1:C) nan(1, C+1)]; % Close bottom
Yfill = [Y(1, 1:C) nan(1, C+1); ...
Y flip(Y, 2) Y(:, 1); ...
Y(R, 1:C) nan(1, C+1)];
Zfill = [zeros(1, C) nan(1, C+1); ...
Z zeros(R, C) Z(:, 1); ...
zeros(1, C) nan(1, C+1)];
surf(Xfill, Yfill, Zfill);
view(-120, -20);
Опять же, вы можете построить всю закрытую поверхность одним вызовом surf
. Вот вид снизу, показывающий закрытое дно:
![enter image description here](https://i.stack.imgur.com/72v7x.png)
Вариант № 3: Добавить отдельный объект поверхности для сторон:
Когда вы изображаете все как один объект, вы ограничены, если хотите рендерить стороны не так, как верх. Разделяя стороны отдельными объектами, как Андер делает (используя patch
или отдельный вызов surf
), вы получите больший контроль над тем, как они окрашены относительно верхней поверхности. Чтобы создать единый объект поверхности для всех четырех сторон, вы можете извлечь записи по краям матриц и скопировать их по мере необходимости:
[R, C] = size(Z);
Xside = [1; 1]*[X(1, :) ... % Get first row
X(2:R, C).' ... % Get last column, without first row
X(R, (C-1):-1:1) ... % Get last row, without last column, flipped
X((R-1):-1:1, 1).']; % Get first column, without last row, flipped
Yside = [1; 1]*[Y(1, :) ...
Y(2:R, C).' ....
Y(R, (C-1):-1:1) ...
Y((R-1):-1:1, 1).'];
Zside = [Z(1, :) ...
Z(2:R, C).' ...
Z(R, (C-1):-1:1) ...
Z((R-1):-1:1, 1).'; ...
zeros(1, 2*(R+C)-3)];
surf(X, Y, Z); % Plot top surface
hold on;
surf(Xside, Yside, Zside, ... % Plot all four sides...
'EdgeColor', 'none', ... % with no edge coloring (i.e. grid)...
'FaceAlpha', 0.5); % and transparency
view(-120, 30);
И полученный сюжет:
![enter image description here](https://i.stack.imgur.com/9Myx6.png)