当前位置: 首页 > article >正文

MATLAB实战 | 不同形式的三维曲面图

 通常,MATLAB中绘制三维曲面图,先要生成网格数据,再调用mesh函数和surf函数绘制三维曲面。若曲面用含两个自变量的参数方程定义,则还可以调用fmesh函数和fsurf函数绘图。若曲面用隐函数定义,则可以调用fimplicit3函数绘图。

01、三维曲面

1. 产生网格坐标矩阵

在MATLAB中产生二维网格坐标矩阵的方法是: 将x方向区间[a,b]分成m份,将y方向区间[c,d ]分成n份,由各划分点分别作平行于两坐标轴的直线,将区域[a,b]×[c,d]分成m×n个小网格,生成代表每一个小网格顶点坐标的网格坐标矩阵。例如,在xy平面选定一矩形区域,如图1所示,其左下角顶点的坐标为(2,3),右上角顶点的坐标为(6,8)。然后在x方向分成4份,在y方向分成5份,由各划分点分别作平行于两坐标轴的直线,将区域分成5×4个小矩形,总共有6×5个顶点。用矩阵X、Y分别存储每一个网格顶点的x坐标与y坐标,矩阵X、Y就是该矩形区域的xy平面网格坐标矩阵。

■ 图1网格坐标示例在MATLAB中,产生平面区域内的网格坐标矩阵有两种方法。 

(1) 利用矩阵运算生成。例如,生成图5-24中的网格坐标矩阵,使用以下命令: 

 

 (2) 调用meshgrid函数生成二维网格坐标矩阵,函数的调用格式如下:

 其中,输入参数x、y为向量,输出参数X、Y为矩阵。命令执行后,矩阵X的每一行都是向量x,行数等于向量y的元素的个数; 矩阵Y的每一列都是向量y,列数等于向量x的元素的个数。矩阵X和Y相同位置上的元素(Xij,Yij)存储二维空间网格顶点(i,j)的坐标。例如,生成图1中的网格坐标矩阵,也可以使用以下命令:

函数参数可以只有一个,此时生成的网格坐标矩阵是方阵,例如:

 meshgrid函数也可以用于生成三维网格数据,调用格式如下:

[X,Y,Z] = meshgrid(x,y,z)

其中,输入参数x、y、z为向量,输出参数X、Y、Z为三维数组。命令执行后,数组X、Y和Z的第一维大小和向量x元素的个数相同,第二维大小和向量y元素的个数相同,第三维大小和向量z元素的个数相同。X、Y和Z相同位置上的元素(Xijk,Yijk,Zijk)存储三维空间网格顶点(i,j,k)的坐标。

ndgrid函数用于生成n维网格数据,调用格式如下: 

[X1,X2,...Xn] = ndgrid(x1,x2,...xn)

 其中,输入参数x1、x2、…、xn为向量,输出参数X1、X2、…、Xn为n维矩阵。例如:

对比前面meshgrid网格数据会发现,meshgrid网格数据进行转置即得到ndgrid网格数据。

2. mesh函数和surf函数 

MATLAB提供了mesh函数和surf函数来绘制三维曲面图。mesh函数用于绘制三维网格图,网格线条有颜色,网格线条之间无颜色; surf函数用于绘制三维曲面图,网格线条之间的补面用颜色填充。surf函数和mesh函数的调用格式为:

mesh(x,y,z,c)
surf(x,y,z,c)

通常,输入参数x、y、z是同型矩阵,x、y定义网格顶点的xy平面坐标,z定义网格顶点的高度。选项c用于指定在不同高度下的补面颜色。c缺省时,MATLAB认为c=z,即颜色的设定值默认正比于图形的高度,这样就可以绘制出层次分明的三维图形。当x,y是向量时,要求x的长度等于矩阵z的列数,y的长度等于矩阵z的行数,x、y向量元素的组合构成网格顶点的x、y坐标。

【例1】已知 

其中,x、y的40个值均匀分布在[-2,2]范围内,绘制三维曲面图。

程序如下

x = linspace(-2,2,40);
[xx,yy] = meshgrid(x);
zz = xx * exp(-(xx^2 + yy^2));
mesh(xx,yy,zz);
title('mesh');
xlabel('X');
ylabel('Y');
zlabel('Z');

程序运行结果如图2所示。mesh、surf函数的前两个参数x、y也可以是行向量或列向量,所以程序中的mesh函数也可以写成mesh(x,x,zz)。 

 ■ 图2 三维曲面图

若调用surf、mesh函数时,省略前两个输入参数x、y,则把z矩阵的第二维下标当作x坐标,把z矩阵的第一维下标当作y坐标,然后绘制三维曲面图。例如:

>>t = 1 : 5;
>>z = [0.5*t;2*t;3*t];
>>mesh(z);

第二条命令生成的z是一个3×5的矩阵,执行mesh(z)命令绘制图形,曲面各个顶点的x坐标是z元素的列下标,y坐标是z元素的行下标。

此外,还有两个和mesh函数功能相似的函数,即meshc函数和meshz函数,其用法与mesh函数类似,不同的是meshc函数还在xy平面上绘制曲面在z轴方向的等高线,meshz函数还在xy平面上绘制曲面的底座。surf函数也有两个类似的函数,即具有等高线的曲面函数surfc和具有光照效果的曲面函数surfl。 

【例2】在xy平面内选择区域[-8,8]×[-8,8],利用下列函数绘制4种形式的三维曲面图。

程序如下:

[x,y] = meshgrid(-8:0.5:8);
z = sin(sqrt(x^2+y^2))/sqrt(x^2+y^2);
subplot(2,2,1);
meshz(x,y,z);
title(meshz(x,y,z));
subplot(2,2,2);
meshc(x,y,z);
title(meshc(x,y,z));
subplot(2,2,3);
surfl(x,y,z);
title(surfl(x,y,z));
subplot(x,y,z);
title(surfc(x,y,z));

程序运行结果如图3所示。

■ 图3 4种形式的三维曲面图


http://www.kler.cn/a/147333.html

相关文章:

  • mybatis的动态sql用法之排序
  • MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并
  • 深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器
  • 使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面
  • springboot实现简单的数据查询接口(无实体类)
  • 云计算复习文档
  • STM32 ADC转换器、串口输出
  • 【深度学习】Transformer简介
  • wireshark 抓包提示
  • LeetCode746. Min Cost Climbing Stairs
  • Python---引用变量与可变、非可变类型
  • Ubuntu 22.03 LTS 安装deepin-terminal 实现 终端 分屏
  • 笔记二十一、使用路由search进行传递参数
  • pandas教程:时区计数 USA.gov Data from Bitly USA.gov数据集
  • 反爬虫机制与反爬虫技术(二)
  • 【ISP】噪声--sensor(2)
  • DS二叉树--赫夫曼树解码/最优二叉树【数据结构】
  • acwing算法基础之动态规划--背包问题
  • 【服务器能干什么】搭建一个短网址平台,可以查看数据详情!
  • Java的buffer.flip()是个什么东西?
  • XML Schema中的attributeFormDefault
  • el-row el-col书写不规范的问题,会换行
  • 奖学金问题
  • Ansible的module_defaults
  • 深兰科技“汉境”入选2023年湖北省人工智能十大优秀应用案例
  • 实时云渲染简要分析