基于MATLAB函数mesh绘制由多张曲面围成的三维封闭曲面详解

一、引言
在数学上经常要画三维曲面的图形,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( '旋转抛物面', '平面', '抛物柱面' );

四、输出图形
在这里插入图片描述
五、补充说明
如果想绘制其它封闭曲面,可以根据上述步骤逐一绘制单张曲面,然后绘制在一个图形窗口即可,再根据需要进行裁剪即可得到完美的封闭曲面。

  • 11
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值