在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系列的文章了~
理想果然很丰满..........