您可以通过构建一组新的矩阵来添加额外的表面以传递给 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
来绘制整个封闭曲面。这是底面的 View ,显示了封闭的底部:
选项 #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);
结果图:
我是一名优秀的程序员,十分优秀!