Matlab绘制三维图形

个人学习笔记,课程为数学建模清风付费课程

目录

一、mesh函数-网格图

1.1mesh(X,Y,Z)

1.1.1用法一

1.1.2用法二

1.2mesh(Z)

1.3思考:如果X中元素不是按照从小到大排序的,图像会是什么样子?

1.4例题

1.4.1例题一

1.4.2例题二

1.5meshc函数:绘制曲面的等高线

1.6meshz函数:绘制曲面的底座

二、surf函数-曲面图

2.1例题对比

2.1.1例题一

2.1.2例题二 

​2.2surfc-绘制曲面的等高线

2.3surf1-添加曲面的灯光效果

2.4设置色彩模式

三、contour函数-等高线图

3.1contour(x,y,z)

3.2contour(x,y,z,n)

3.3contour(x,y,z,levels)

3.4思考:如果只想画出高度为3的单等高线怎么办?

3.5contourf-填充颜色

3.6contour3-三维等高线 

四、符号函数的三维图形

4.1plot3-折线图

4.2fplot-添加范围

4.3fmesh-网格图

4.4fsurf-曲面图

4.5fcontour-等高线图

五、隐函数的三维图形

5.1fimplicit3(f) 

5.2fimplicit3(f,interval)


一、mesh函数-网格图

1.1mesh(X,Y,Z)

1.1.1用法一

mesh(X,Y,Z)的用法,其中Xn维向量,Y是m维向量,Z是m*n维的矩阵
%% mesh(X,Y,Z)的用法,其中X是n维向量,Y是m维向量,Z是m*n维的矩阵
X = [1,2,4]
Y = [3,5]
Z = [4,8,10;5,9,13]
mesh(X,Y,Z)  % (X(j), Y(i), Z(i,j))是线框网格线的交点的坐标
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
% 三维旋转和数据游标的使用,以及X-Y视图的切换(在三维旋转状态下点击鼠标右键)
% 数据游标默认只能添加一个,按住Alt键不动,可以添加多个数据游标
% 插入颜色栏,可显示色阶

 

1.1.2用法二

mesh(X,Y,Z)的用法,其中X、Y和Z都是m*n维的矩阵 

%%  mesh(X,Y,Z)的用法,其中X、Y和Z都是m*n维的矩阵
X = [1,2,4;1,2,4]   
%  X = [1,2,4;1,2,5] 
Y = [3,3,3;5,5,5]
Z = [4,8,10;5,9,13]
mesh(X,Y,Z) % (X(i,j), Y(i,j), Z(i,j))是线框网格线的交点的坐标
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签

1.2mesh(Z)

mesh(Z)的用法,其中Zm*n维的矩阵

等价的X和Y的范围是看Z矩阵的行和列,X取决于Z的行,Y取决于Z的列

%% mesh(Z)的用法,其中Z是m*n维的矩阵
Z = [4,8,10;5,9,13]
mesh(Z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签

% 等价于
X = 1:3
Y = 1:2
Z = [4,8,10;5,9,13]
mesh(X,Y,Z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签

1.3思考:如果X中元素不是按照从小到大排序的,图像会是什么样子?

%% 思考:如果X中元素不是按照从小到大排序的,图像会是什么样子?
X = [1,10,4]
Y = [3,5]
Z = [4,8,10;5,9,13]
mesh(X,Y,Z)
hidden off  % 可以看到背部的图像,不会遮挡(默认是看不到的)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签

% 如果觉得背部的图像显示的颜色太深了,可以更改透明度
mesh(X,Y,Z)
alpha(0.8)  % 设置透明度为0.8,这时候隐隐约约能看到(透明度介于0-1之间,越大表示越透明)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签

 

1.4例题

1.4.1例题一

例题1:绘制 z = x^2 - y^2的图像 ,其中x和y都位于[0,5]之间

%% 例题1:绘制 z = x^2 - y^2的图像 ,其中x和y都位于[0,5]之间
% linspace是Matlab中的一个函数,用于产生给定范围内指定数量的点数,相邻数据跨度相同,并返回一个行向量。
% 调用方法:linspace(x1,x2,N)
% 功能:用于产生x1,x2之间的N点行向量,相邻数据跨度相同。其中x1、x2、N分别为起始值、终止值、元素个数。
n = 11;
tem = linspace(0,5,n);  % 将[0,5]这个区间等分为n个点(等差数列的形式)
x = repmat(tem,n,1);
y = repmat(tem',1,n);
z = x.^2 - y.^2;    % 要使用点运算符号哦~
mesh(x,y,z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示

 

 

1.4.2例题二

例题2: 绘制 z = sin(sqrt(x^2+y^2))/sqrt(x^2+y^2) 的图形,其中x和y都位于[-5,5]之间 

%% 例题2: 绘制 z = sin(sqrt(x^2+y^2))/sqrt(x^2+y^2) 的图形,其中x和y都位于[-5,5]之间
[x,y] = meshgrid(-5:0.5:5);  % 快速生成网格所需的数据
tem = sqrt(x.^2+y.^2)+1e-12;   % tem=sqrt(x.^2+y.^2);   % 在后面加上一个非常非常小的数字: 1e-12 = 10^(-12) ,当然你也可以单独找到值为0的地方对其修改
z = sin(tem)./tem;  % 如果不对tem处理,那么z的最中间的一个值 0/0 = NaN
mesh(x,y,z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示

 

1.5meshc函数:绘制曲面的等高线

%% meshc函数:除了mesh函数图形外,还在xy平面上绘制曲面的等高线
meshc(x,y,z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示

1.6meshz函数:绘制曲面的底座

%% meshz函数:除了mesh函数图形外,还在xy平面上绘制曲面的底座
meshz(x,y,z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示

 

二、surf函数-曲面图

surf函数和mesh函数的的调用格式基本相同

两者的区别: mesh绘出彩色的线,surf绘出彩色的面

2.1例题对比

2.1.1例题一

%% 例题1的对比
[x,y] = meshgrid(linspace(0,5,11));
% [x,y] = meshgrid([0:0.5:5]);  或者直接写成[x,y] = meshgrid(0:0.5:5);
z = x.^2 - y.^2;
subplot(1,2,1)  % subplot(m,n,index)
mesh(x,y,z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
title('mesh(x,y,z)')

subplot(1,2,2)
surf(x,y,z)  
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
% axis([0,5,0,5,-inf,+inf])  % 设置坐标轴刻度范围
title('surf(x,y,z)')

2.1.2例题二 

%% 例题2的对比
[x,y] = meshgrid(-5:0.5:5);  % 快速生成网格所需的数据
tem = sqrt(x.^2+y.^2)+1e-12;   
z = sin(tem)./tem;  % 如果不对tem处理,那么z的最中间的一个值 0/0 = NaN
subplot(1,2,1)
mesh(x,y,z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
title('mesh(x,y,z)')

subplot(1,2,2)
surf(x,y,z)  % (X(j), Y(i), Z(i,j))是线框网格线的交点
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
title('surf(x,y,z)')

2.2surfc-绘制曲面的等高线

%% surfc函数:除了surf函数图形外,还在xy平面上绘制曲面的等高线
surfc(x,y,z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示

2.3surf1-添加曲面的灯光效果

%% surfl函数:加上了灯光效果,看起来自然点
surfl(x,y,z)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示

2.4设置色彩模式

shading 是用来处理色彩效果的,分以下三种:
shading faceted是默认的模式
shading flat 在faceted的基础上去掉图上的网格线
shading interp 在flat的基础上进行色彩的插值处理,使色彩平滑过渡
%% 设置色彩模式
% shading 是用来处理色彩效果的,分以下三种:
% shading faceted是默认的模式 
% shading flat 在faceted的基础上去掉图上的网格线
% shading interp 在flat的基础上进行色彩的插值处理,使色彩平滑过渡
subplot(1,3,1)
surf(x,y,z)  % (X(j), Y(i), Z(i,j))是线框网格线的交点
shading faceted % 默认的色彩模式
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
title('shading faceted')

subplot(1,3,2)
surf(x,y,z)  % (X(j), Y(i), Z(i,j))是线框网格线的交点
shading flat % 看起来光滑一点
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
title('shading flat')

subplot(1,3,3)
surf(x,y,z)  % (X(j), Y(i), Z(i,j))是线框网格线的交点
shading interp % 看起来最光滑
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
title('shading interp')

三、contour函数-等高线图

[x,y] = meshgrid(-3:0.1:3);  
% 一个语句太长时,可以加上三个点然后在下一行继续写
z =  3*(1-x).^2.*exp(-(x.^2) - (y+1).^2)...  
    -10* (x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
    - 1/3*exp(-(x+1).^2 - y.^2);  % matlab中内置的peaks函数,常常作为演示使用
% edit peaks

3.1contour(x,y,z)

%% contour(x,y,z) 在x-y平面绘制等高线图,Matlab会自动选择等高线的层级
contour(x,y,z)
xlabel('x轴');  ylabel('y轴');  % 加上坐标轴的标签

 

3.2contour(x,y,z,n)

%% contour(x,y,z,n) 在x-y平面绘制等高线图,n是一个标量,那么Matlab会将等高线的层数设置为n,且会自动选择层所在的高度。
contour(x,y,z,5)

contour(x,y,z,5,'LineWidth',2)  % 设置线的宽度为2

contour(x,y,z,5,'--')  % 设置等高线为虚线

contour(x,y,z,5,'ShowText','on')  % 显示每一层的高度

contour(x,y,z,5,'--','ShowText','on','LineWidth',2)  % 可以组合起来使用
colorbar % 显示颜色栏,也可以手动插入
xlabel('x轴');  ylabel('y轴');  % 加上坐标轴的标签

3.3contour(x,y,z,levels)

%% contour(x,y,z,levels) 若想得到固定的n个高度的等高线,将levels可以设置为n元行向量,其中向量中的值为高度值。
maxz = max(max(z))
minz = min(min(z))
levels = linspace(minz,maxz,10)  % 从最小值到最大值,等分成10个点
contour(x,y,z,levels,'ShowText','on','LineWidth',1)  % 最小值或者最大值可能显示不出来,因为Matlab会帮我们自动调整
xlabel('x轴');  ylabel('y轴');  % 加上坐标轴的标签

3.4思考:如果只想画出高度为3的单等高线怎么办?

% 思考如果只想画出高度为3的单等高线怎么办?
contour(x,y,z,[3 3],'ShowText','on') 
xlabel('x轴');  ylabel('y轴');  % 加上坐标轴的标签

3.5contourf-填充颜色

%% contourf函数:和contour函数类似,只不过画出来的等高线图有颜色填充
contourf(x,y,z,levels,'ShowText','on') 
xlabel('x轴');  ylabel('y轴');  % 加上坐标轴的标签

 

3.6contour3-三维等高线 

%% contour3函数:3维等高线图,等高线不再投影到x-y平面
contour3(x,y,z,levels,'ShowText','on') 
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签

 

四、符号函数的三维图形

4.1plot3-折线图

%% plot3函数 (类似于plot函数,实际上可以认为画的是三维空间下的折线图)
% t = 0: 0.1: 4*pi;   % 符号是t,t从0变动到4pi,间隔设置为0.1
t = linspace(0,4*pi,100);  % 符号是t,t从0变动到4pi,等分为100个点
x = sin(t)+1; % 利用t计算x的值
y = cos(t);  % 利用t计算y的值
z = t; % 利用t计算z的值
plot3(x,y,z)  % 绘制三维空间下的折线图

plot3(x,y,z,'r--') 
% close  % 关闭图形

4.2fplot-添加范围

%% fplot3函数 (2016a版本推出的函数,老版本Matlab用的是ezplot3函数,未来版本可能会被淘汰)
syms t  % 符号是t
x = sin(t)+1;
y = cos(t); 
z = t;
fplot3(x,y,z) % 默认t的变化范围为[-5 5]

fplot3(x,y,z,[0 4*pi]) % 修改t的变化范围为0至4pi
% close  % 关闭图形

 

4.3fmesh-网格图

%% fmesh 三维网格图 (2016a版本推出的函数,老版本Matlab用的是ezmesh函数,未来版本可能会被淘汰)
syms x y 
z=x^2+y^2;
fmesh(z) % 默认x的变化范围和y的变化范围都是[-5 5]

fmesh(z,[-2 2 -4 4]) % 修改x的变化范围和y的变化范围分别为[-2 2]和[-4 4]

% axis vis3d  % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
% axis equal  % 设置屏幕高宽比,使得每个坐标轴的具有均匀的刻度间隔
fmesh(z,[-2 2 -4 4],'MeshDensity',11)   % 设置每个方向计算的点数

 插播:用fmesh花一朵花

% 画一朵花花送给亲爱的Ta
syms u v
r = 2 + sin(7.*u + 5.*v);
x = r.*cos(u).*sin(v);
y = r.*sin(u).*sin(v);
z = r.*cos(v);
% 可以直接用乘号
% r = 2 + sin(7*u + 5*v);
% x = r*cos(u)*sin(v);
% y = r*sin(u)*sin(v);
% z = r*cos(v);
fmesh(x,y,z,[0 2*pi 0 pi])
alpha(0.8)

 

4.4fsurf-曲面图

%% fsurf 三维曲面图 (2016a版本推出的函数,老版本Matlab用的是ezsurf函数,未来版本可能会被淘汰)
syms x y 
z=x^2+y^2;
fsurf(z) % 默认x的变化范围和y的变化范围都是[-5 5]

fsurf(z,[-2 2 -4 4]) % 修改x的变化范围和y的变化范围分别为[-2 2]和[-4 4]

% axis vis3d  % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
% axis equal  % 设置屏幕高宽比,使得每个坐标轴的具有均匀的刻度间隔
fsurf(z,[-2 2 -4 4],'MeshDensity',11)   % 设置每个方向计算的点数

插播:fsurf画一朵花

% 画一朵花花送给亲爱的Ta
syms u v
r = 2 + sin(7.*u + 5.*v);
x = r.*cos(u).*sin(v);
y = r.*sin(u).*sin(v);
z = r.*cos(v);
fsurf(x,y,z,[0 2*pi 0 pi])

 

4.5fcontour-等高线图

%% fcontour 绘制等高线 (2016a版本推出的函数,老版本Matlab用的是ezcontour函数,未来版本可能会被淘汰)
syms x y 
z=x^2+y^2;
fcontour(z) % 默认x的变化范围和y的变化范围都是[-5 5]

fcontour(z,[-2 2 -4 4]) % 修改x的变化范围和y的变化范围分别为[-2 2]和[-4 4]

fcontour(z,'fill','on') % 在等高线线条间进行填充

五、隐函数的三维图形

5.1fimplicit3(f) 

% fimplicit3(f) 在默认区间 [-5 5]上绘制 f(x,y,z) = 0 定义的三维隐函数。
f = @(x,y,z) x.^2 + y.^2 - z.^2;  % 函数句柄(在拟合那一节里面介绍过),这里要注意,要用点运算符
fimplicit3(f)
xlabel('x轴');  ylabel('y轴');  zlabel('z轴');  % 加上坐标轴的标签

interval = [-5 5 -5 5 0 5];   % 指定范围
fimplicit3(f,interval)

fimplicit3(f,interval,'EdgeColor', 'none', 'FaceAlpha',0.5)  % 去掉边缘颜色,调整透明度

5.2fimplicit3(f,interval)

% fimplicit3(f,interval) 为 x、y 和 z 指定绘图区间。
f = @(x,y,z) (x.^2+(9/4)*y.^2+z.^2-1).^3-x.^2.*z.^3-(9/80)*y.^2.*z.^3;
fimplicit3(f,[-1.5,1.5,-1.5,1.5,-1.5,1.5],'EdgeColor', 'none', 'FaceAlpha',0.5);

### 创建和处理二维与三维叠加图形MATLAB 中创建和处理二维与三维叠加图形可以通过多种方法实现。以下是具体的方法: #### 方法一:使用 `hold on` 命令在同一坐标系中绘制不同维度的图形 通过设置不同的轴范围来确保两种类型的图形可以清晰显示。 ```matlab % 定义数据 [x, y] = meshgrid(-8:.5:8); R = sqrt(x.^2 + y.^2) + eps; z = sin(R)./R; figure; subplot(1,2,1); % 绘制三维曲面图 surf(x, y, z); title('三维曲面'); xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴'); subplot(1,2,2); % 绘制对应的投影到XY平面上的等高线作为二维表示形式 contour(x, y, z, 20,'k'); title('二维等高线'); xlabel('X轴'); ylabel('Y轴'); colorbar; figure; % 同一窗口内同时展示两者并保持比例适当 surf(x, y, z); hold on; [c,h]=contour(x,y,z,[0.5 0.7],'-r','LineWidth',2); clabel(c,h); view([90 90]); % 设置视角为俯视角度查看效果更佳 axis equal tight; box off; ``` 这段代码展示了如何在一个图表里既呈现三维表面又加上其底下的二维轮廓线条,从而形成一种视觉上的重叠[^1]。 #### 方法二:基于多层透明度调整实现真正的空间位置上相交覆盖 对于更加复杂的场景比如医学影像分析等领域,则可能涉及到真正意义上的体素级别的融合操作。 ```matlab % 加载示例体积数据集 load mri D; D = squeeze(D); % 显示MRI切片序列(近似代表一系列连续断层面) montage(D,[],'Size',[8 8]); % 构建完整的3D模型并通过alpha属性控制部分区域半透明白化程度 p = patch(isosurface(D, 5), 'FaceColor', 'red',... 'EdgeColor', 'none'); isonormals(D,p) set(p,'AmbientStrength',.4) daspect([1 1 .3]) camlight right; lighting phong alpha(.2) % 添加额外一层彩色平面映射至特定截面处 [xg,yg,zg] = ndgrid(1:size(D,2),1:size(D,1),1:size(D,3)); sliceObj = slice(xg,yg,zg,D,[],[],size(D,3)/2); colormap hot shading interp alpha(sliceObj,.8) view([-65 20]); ``` 此段脚本先建立了一个人脑磁共振成像(MRI)扫描结果的整体立体结构,再在其内部指定高度插入了一个横截面图像,并且巧妙运用颜色渐变及透明度参数让二者自然过渡衔接起来[^2]。 #### 方法三:动态更新机制下模拟波动现象相互作用过程 当关注的是随时间变化而演变的过程时,可采用动画技术记录每一帧的状态变迁情况。 ```matlab t = linspace(0,pi*2,1e3)'; A1 = cos(t)*exp(-abs((mod(t-pi/2, pi)-pi/2))); A2 = -cos(t+randn()*pi*.1).*exp(-abs(mod(t-pi*(3/2), pi)-pi/2)); for i=1:length(t) clf; subplot(2,1,1); plot(A1(i),'b-', A2(i),'r--'); ylim([-1 1]); title(['T=',num2str(t(i))]); subplot(2,1,2); surf(peaks(30)+A1(i)); shading flat; hold all; surf(peaks(30)+A2(i)); shading interp; camorbit(1,-1); drawnow limitrate; end ``` 上述程序片段定义了两个周期性的振荡信号,在循环体内不断刷新当前时刻各自的形态特征;与此同时,还构造了一对具有相似频率特性的随机噪声干扰源施加给标准测试函数peaks()所形成的地形地貌之上,以此达到直观感受波峰谷交替起伏的效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值