您可以通过构建一组新矩阵来添加额外的表面以传递给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 来绘制曲面和侧面,结果如下:
选项#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 即可绘制整个封闭曲面。这是底部的视图,显示了封闭的底部:
选项#3:为侧面添加一个单独的表面对象:
将所有内容绘制为一个对象时,如果您想以不同于顶部的方式渲染侧面,则会受到限制。使侧面像Ander does 那样分隔对象(使用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);
以及由此产生的情节: