Matlab系列之三维图形

2021-06-29 14:53:49 浏览数 (2)

在Matlab中,三维图形有:三维曲线、三维网格以及三维曲面,分别对应函数:plot3、mesh和surf,本篇将介绍些常规使用以及一些三维图形的处理。

三维曲线图

和二维曲线的命令相似,用法也与plot的类似,调用格式:

plot3(x,y,z) 功能:x,y,z如果是同长度的向量,则绘制对应的空间三维曲线;若是同阶矩阵,则绘制对应列的多条曲线。 也可以像plot函数一样对绘制的曲线类型,颜色等进行设置,具体的可用参数,使用命令“doc Chart Line Properties”查看

举例

代码语言:javascript复制
%使用sin和cos组成三维的螺旋曲线 
t = 0:pi/50:10*pi; 
st = sin(t); 
ct = cos(t); 
 
figure 
plot3(st,ct,t,'b^-'); 
xlabel('sin(t)'); 
ylabel('cos(t)'); 
zlabel('t');

结果

三维网格图

三维网格图和三维曲线图有明显的区别,mesh可以绘制一段区间的整个曲面,不再是单条曲线,不过多曲线叠加后,更像是网格,和等下介绍的曲面还是存在一些小区别。

调用格式:mesh(x,y,z) 功能描述:根据矩阵x,y,z绘制三维曲线,x,y,z矩阵中的元素就是三维图形中各个对应的点,然后点与点进行了线的连接,线的颜色将随点的高度改变而改变。 注意事项:在使用函数前,需要先在xy平面建立网格坐标:[x,y]=meshgrid(x,y),然后再利用新的x,y计算网格上对应z的点,从而得到构建曲面所需的点,最后再使用mesh绘制整个图

举例1

代码语言:javascript复制
%sinc函数 
x=-8:.5:8; 
y=x; 
[X,Y] = meshgrid(x,y); 
R = sqrt(X.^2   Y.^2)   eps; 
Z = sin(R)./R; 
 
figure 
mesh(X,Y,Z)%直接mesh(Z)也可以

结果1

再介绍下mesh的“补充”函数meshc和meshz

举例2

代码语言:javascript复制
%sinc函数 
x=-8:.5:8; 
y=x; 
[X,Y] = meshgrid(x,y); 
R = sqrt(X.^2   Y.^2)   eps; 
Z = sin(R)./R; 
 
figure 
%mesh(X,Y,Z)%直接mesh(Z)也可以 
subplot(211);meshc(Z);%绘制等高线 
subplot(212);meshz(Z);%绘制界线

结果2

三维曲面图

曲面图其实就是在网格图的基础上进行了颜色填充,surf的调用格式:

surf(x,y,z) 功能描述:与mesh的一致

举例1

代码语言:javascript复制
x=-5:5; 
y=x; 
[X,Y]=meshgrid(x,y); 
Z=X.^2 Y.^2; 
 
figure; 
surf(X,Y,Z); 
colormap cool%调色为cool

结果1

surf也有“补充”函数:surfc和surfl

举例2

代码语言:javascript复制
x=-5:0.1:5; 
y=x; 
[X,Y]=meshgrid(x,y); 
Z=peaks(X,Y); 
 
figure; 
subplot(211);surfc(X,Y,Z);%等高线 
subplot(212);surfl(X,Y,Z);%光照 
shading INTERP%转换成阴影模式,便于结果光照现象的查看

结果2

三维图形的修饰

有时候绘制出来的三维图形,可能对于我们信息的获取还存在一定的麻烦,因此可以通过对图形的修饰(视点位置、色彩、裁剪等),以增强图形的效果,方便信息获取,在上面三维图的绘制时,也已经用到了一些,这边再稍微系统的归纳一下。

三维图形的视点处理

视点处理,即从不同角度去观察物体,视点位置可由方位角和仰角决定,本处介绍的view函数,就有两个参数:az和el,az是azlmuth(方位角)的缩写,el是elevation(仰角)的缩写,单位都为度。具体的方向表示,可根据下方的示例图理解,没法体会的话,就等下直接从示例的图形来理解吧,系统默认采用的视点为:方位角(-37.5°)、仰角(30°),可以对应此时图上Azimuth和Elevation对应的角度方向。

view函数介绍

view(az,el)或view([az,el])%直接设定视点位置 view([x,y,z])%将坐标系的某个具体的空间点设为视点位置,忽略向量的长度大小 view(2)%二维的状态,az = 0, el = 90 view(3)%az = –37.5, el = 30. [az,el] = view%返回当前的方位角和仰角

举例1

代码语言:javascript复制
%不同视点位置的peaks 
subplot(221);surf(peaks);view(2);title('az=0;el=90'); 
subplot(222);surf(peaks);view(3);title('az=-37.5;el=30'); 
subplot(223);surf(peaks);view(90,0);title('az=90;el=0'); 
subplot(224);surf(peaks);view(-10,-10);title('az=-10;el=-10');

结果1

举例2

代码语言:javascript复制
close all; 
figure; 
mesh(peaks);%绘制多峰 
el=30;%仰角30 
for az=-180:180 
          view(az,el); 
          drawnow; 
end 
az=0; 
for el=-180:180 
          view(az,el); 
          drawnow; 
end

结果2

ps:本来想搞GIF动图的,但是帧数太多,就直接视频传上来了.....

颜色处理

在使用mesh和surf这些函数的时候,matlab都会对其进行默认的配色,此外可以通过shading自由设置图形的表面颜色,这个已经有过简单使用了,再进行介绍下

调用格式: shading flat %用同一种颜色配色,表面更光滑 shading faceted %系统的默认配色 shading interp %插值处理的方式配色,表面非常光滑 shading(axes_handle,...) %对指定句柄对应的图,设置shading的类型

举例

代码语言:javascript复制
figure 
subplot(1,3,1) 
sphere(16) 
axis equal 
title('Faceted Shading (Default)') 
 
subplot(1,3,2) 
sphere(16) 
shading flat 
axis equal 
title('Flat Shading') 
 
subplot(1,3,3) 
sphere(16) 
shading interp 
axis equal 
title('Interpolated Shading')

结果

此外还有个colormap的函数也可以进行配色,以前有介绍过,就不再多说了。

除了用函数进行配色外,还可以用颜色图编辑器直接对图形颜色进行重新设置,在命令窗口输入:colormapeditor

弹出以下的功能窗口,然后鼠标去点击要配色的图形,会显示对应图形的标题,然后根据需要进行配色即可。

光照处理

在介绍surf的时候,已经出现了该字眼,不过这边用到的是独立的光照函数,即light;

调用格式:light('PropertyName',propertyvalue,...)%属性使用,自行根据命令获取:doc Light Properties; %color,position和style三个属性

举例

代码语言:javascript复制
[x,y,z]=sphere(20); 
subplot(121);surf(x,y,z);axis equal;light('position',[0,1,1]);shading interp;hold on; 
plot3(0,1,1,'ro');%做个位置标识 
text(0,1,1,'light'); 
subplot(122);surf(x,y,z);axis equal;light('position',[1,0,1]);shading interp;hold on; 
plot3(1,0,1,'ro'); 
text(1,0,1,'light');

结果

不同位置light,有着明显的光照差异。

结束

画图的篇章到此算是告一段落了,接下来打算对matlab的其他工具做些介绍,估计再搞两三篇工具介绍,就差不多可以搞下应用来完结掉Matlab系列的文章了~

理想果然很丰满..........

0 人点赞