一、引言
在数学上经常要画三维曲面的图形,MATLAB提供了强大的三维绘图功能,常用的函数有mesh、surf、fmesh、fsurf、fimplicit3等,可以绘制单一的曲面,也可以绘制封闭曲面。在三重积分中经常用到封闭曲面,因此本文以旋转抛物面、抛物柱面和平面所围成的封闭曲面为例,详述了绘图过程。
二、具体实现步骤及相关代码
由于所绘封闭曲面由三张曲面围成,因此需要逐一进行绘制。
1.绘制旋转抛物面z = x^2 + y^2
首先给定自变量x和y的取值范围。考虑到旋转抛物面的特点,因此使用极坐标来处理,即设定极角和极径,再转换为直角坐标,利用mesh绘制,参考代码如下:
%绘制完整的旋转抛物面
theta = [ 0:0.001:2 ] * pi; %极角的取值范围数组
r = [ 0:0.005:1 ];%极径的取值范围数组
[R, T] = meshgrid( r, theta );%生成网格坐标
X1 = R .* cos(T);%生成横坐标
Y1 = R .* sin(T);%生成纵坐标
Z1 = X1.^2 + Y1.^2;%旋转抛物面的竖坐标
C1 = 2 * ones( size(Z1) );%指定颜色
mesh( X1, Y1, Z1, C1 );%绘制旋转抛物面的网格图
2.绘制平面z = 1
借用上一步旋转抛物面的横坐标和纵坐标,利用函数mesh绘制平面,参考代码如下:
Z2 = ones( size(X1) );%平面的竖坐标
C2 = ones( size(Z2) );%指定颜色
mesh( X1, Y1, Z2, C2 );%绘制平面的网格图
3.绘制抛物柱面y = x^2
该抛物柱面平行于z轴,因此首先在ZOX平面上生成横坐标和竖坐标的网格坐标,再利用函数mesh进行绘制,参考代码如下:
x = [ -1 : 0.001 : 1 ];%横坐标取值范围
z = [ 0 : 0.001 : 1 ];%竖坐标取值范围
[ X3, Z3 ] = meshgrid( x, z );%生成ZOX平面网格坐标
Y3 = X3 .^ 2;%抛物柱面的纵坐标
C3 = 6 * ones( size(Z3) );%指定颜色
mesh( X3, Y3, Z3, C3 );%绘制抛物柱面的网格图
4.使用上述方法绘制的三张曲面直接融合成一张图时,结果如下:
有此图可以看出,封闭图形是画出来了,但是显然有多余的图元让图形看起来不够美观,因此可以考虑裁剪多余的图元,具体方法如下:
1)裁剪旋转抛物面多余的部分
以抛物柱面为界限,删除多余的部分,代码为:Z1( Y1 - X1.^2 < 0 ) = Inf;
同时根据经验,可以重新指定极角的取值范围。
2)裁剪平面多余的部分
仍旧以抛物柱面为界限,删除多余的部分,代码为:Z2( Y1 - X1.^2 < 0 ) = Inf;
3)裁剪抛物柱面多余的部分
以旋转抛物面为界限,删除多余的部分,代码为:Z3( Z3 < X3.^2 + Y3.^2 ) = Inf;
三、完整的代码
%绘制旋转抛物面 z = x^2 + y^2 、抛物柱面y = x^2和平面 z = 1围成的封闭图形
%%%%1-绘制旋转抛物面 z = x^2 + y^2
clear all
clc
theta = [ 0:0.001:1 ] * pi;
r = [ 0:0.005:1 ];
[R, T] = meshgrid( r, theta );
X1 = R .* cos(T);
Y1 = R .* sin(T);
Z1 = X1.^2 + Y1.^2;
%删除Z1中多余的数据,以抛物柱面y = x^2为边界
Z1( Y1 - X1.^2 < 0 ) = Inf;%可以利用赋值为Inf的方法实现删除多余的数据
C1 = 2 * ones( size(Z1) );
mesh( X1, Y1, Z1, C1 );
hold on %保持住当前图形窗口,此语句必须有
%%%%2-绘制平面 z = 1
Z2 = ones( size(X1) );
%删除Z2中多余的数据,以抛物柱面y = x^2为边界
Z2( Y1 - X1.^2 < 0 ) = Inf;
C2 = ones( size(Z2) );
mesh( X1, Y1, Z2, C2 );
%%%%3-绘制抛物柱面 y = x^2数据
x = [ -1 : 0.001 : 1 ];
z = [ 0 : 0.001 : 1 ];
[ X3, Z3 ] = meshgrid( x, z );
Y3 = X3 .^ 2;
%删除Z3中多余的数据,以选择抛物面z = x^2 + y^2为边界
Z3( Z3 < X3.^2 + Y3.^2 ) = Inf;
C3 = 6 * ones( size(Z3) );
mesh( X3, Y3, Z3, C3 );
xlabel( 'x' )
ylabel( 'y' )
zlabel( 'z' )
axis equal
legend( '旋转抛物面', '平面', '抛物柱面' );
四、输出图形
五、补充说明
如果想绘制其它封闭曲面,可以根据上述步骤逐一绘制单张曲面,然后绘制在一个图形窗口即可,再根据需要进行裁剪即可得到完美的封闭曲面。