5.3 三维图形绘制
在实际的工程应用中,常常遇到三维甚至更多维的数据,需要在图形中表示出来,MATLAB平台提供了相应的三维图形的绘制功能。这些绘图功能与二维图形的绘制十分类似,特别是曲线的属性,例如线型、颜色等的设置,是完全相同的。
最常用的三维绘图有三维曲线图、三维网格图和三维曲面图这3种基本类型,相应的MATLAB指令分别为plot3、mesh和surf。
5.3.1 曲线图绘制
在已经学习了plot指令的基础上,在三维图形指令中,plot3指令十分易于理解,其调用格式也与plot指令类似,具体如下。
● plot3(X,Y,Z):当X、Y、Z为同维向量时,绘制以X、Y、Z为x、y、z坐标的三维曲线;当X、Y、Z为同维矩阵时,用X、Y、Z的对应列元素绘制x、y、z坐标的三维曲线,曲线的条数为矩阵的列数。
● plot3(X1,Y1,Z1,X2,Y2,Z2):绘制以X1、Y1、Z1和X2、Y2、Z2为x、y、z坐标的三维曲线。
● plot3(X,Y,Z,'PropertyName',PropertyValue,…):在PropertyName所规定的曲线属性下,绘制以X、Y、Z为x、y、z坐标的三维曲线。
● plot3(X1,Y1,Z1,'PropertyName1',PropertyValue1,X2,Y2,Z2,'PropertyName2',Property Value2):在PropertyName1所规定的曲线属性下,绘制以X1、Y1、Z1为x、y、z坐标的三维曲线;在PropertyName2所规定的曲线属性下,绘制以X2、Y2、Z2为x、y、z坐标的三维曲线。需要说明的是,plot3指令用来表现的是单参数的三维曲线,而非双参数的三维曲面。
例5-27:plot3指令使用示例。
创建M文件并命名为ex5_27.m,利用M文件编辑器在M文件中输入:
clear all theta = 0 : 0.01 * pi : 2 * pi; x = sin(theta); y = cos(theta); z = cos(4 * theta); figure plot3(x, y, z, 'LineWidth', 2);hold on; theta = 0 : 0.02 * pi : 2 * pi; x = sin(theta); y = cos(theta); z = cos(4 * theta); plot3(x, y, z, 'rd', 'MarkerSize', 10, 'LineWidth', 2)
运行M文件,结果如图5-29所示。
图5-29 三维曲线运行结果
5.3.2 网格图绘制
三维网格图和曲面图的绘制比三维曲线图的绘制稍显复杂,主要是因为绘图数据的准备及三维图形的色彩、明暗、光照和视角等的处理。绘制函数z=f(x,y)的三维网格图的过程如下。
(1)确定自变量x和y的取值范围和取值间隔如下:
x = x1 : dx : x2, y = y1 : dy : y2
(2)构成xoy平面上的自变量采样“格点”矩阵。
①利用“格点”矩阵的原理生成矩阵。
x = x1 : dx : x2; y = y1 : dy : y2; X = ones(size(y)) * x; Y = y * ones(size(x));
②利用meshgrid指令生成“格点”矩阵。
x = x1 : dx : x2; y = y1 : dy : y2; [X, Y] = meshgrid(x, y);
(3)计算在自变量采样“格点”上的函数值:z=f(x,y)。
绘制网格图的基本mesh指令的调用格式如下。
● mesh(X,Y,Z):以X为x轴自变量、Y为y轴自变量,绘制网格图;X、Y均为向量,若X、Y长度分别为m、n,则Z为m×n的矩阵,即[m,n]=size(Z),则网格线的顶点为(Xj ,Yi ,Zij)。
● mesh(Z):以Z矩阵列下标为x轴自变量、行下标为y轴自变量,绘制网格图。
● mesh(X,Y,Z,C):以X为x轴自变量、Y为y轴自变量,绘制网格图;其中C用于定义颜色,如果不定义C,则成为mesh(X,Y,Z),其绘制的网格图的颜色随着Z值的变化(曲面高度)而变化。
● mesh(X,Y,Z,'PropertyName ',PropertyValue,…):以X为x轴自变量、Y为y轴自变量,绘制网格图;PropertyValue用来定义网格图的标记等属性。
例5-28:mesh指令使用示例。
创建M文件并命名为ex5_28.m,利用M文件编辑器在M文件中输入:
clear all X = -10 : 0.1 : 10; Y = -10 : 0.1 : 10; [X, Y] = meshgrid(X, Y); Z = - X .^ 2 - Y .^ 2 + 200; mesh(X, Y, Z)
运行M文件,结果如图5-30所示。
图5-30 3dmesh.m文件运行结果
5.3.3 曲面图绘制
曲面图的绘制由surf指令完成,该指令的调用格式与mesh指令类似,具体如下。
● surf(X,Y,Z)。
● surf(Z)。
● surf(X,Y,Z,C)。
● surf(X,Y,Z,'PropertyName',PropertyValue,…)。
mesh指令所绘制的图形是网格划分的曲面图,而surf指令绘制得到的是平滑着色的三维曲面图,着色的方式是在得到相应的网格点后,对每一个网格依据该网格所代表的节点的色值(由变量C控制)来定义这一网格的颜色。
例5-29:surf指令与mesh指令对比示例。
创建M文件并命名为surfxyz.m(同时存为ex5_29.m),利用M文件编辑器在M文件中输入:
clear all [x, y, z] = peaks(25); figure surf(x, y, z) mesh(x, y, z)
运行M文件,结果如图5-31所示。
图5-31 surfxyz.m运行结果
5.3.4 光照模型
光照是一种利用方向光源照亮物体的技术。在某些情况下,这项技术能使表面微妙的差异更容易看到。光照也能用来对三维的图像增加现实感。
例5-30:带光照的曲面图示例。
创建M文件并命名为ex5_30.m,利用M文件编辑器在M文件中输入:
clear all [X, Y, Z] = peaks(30); figure surf(X, Y, Z, 'FaceColor', 'r', 'EdgeColor', 'none'); camlight left; lighting phong view(-15, 65)
运行M文件,结果如图5-32所示。
图5-32 带光照的曲面图
本例中将曲面涂上了红色,并且将surf指令所定义的网格线移除。同时,一个发光的物体被加到了“镜头”的左边(从空间观看时所在表面的位置)。
增加光源和设置好照明方式到phong后,使用view命令去改变视角,从空间的另一个不同的点再观看表面(方位角-15°和仰角65°)。最后,用工具栏缩放方式放大外观。
基于运用漫射、镜面反光和环境照明模型,MATLAB中还内置了surfl函数,可以画出类似于函数surf产生的带彩色的曲面。使用一个单色颜色映像(如灰色、纯白、铜黄或粉红色)和插值色彩,会画出效果更好的曲面。其调用格式如下。
● surfl(X,Y,Z,S):其中S以[Sx,Sy,Sz]或[az,el]的形式定义光源方向。在没有明确定义的情况下,其默认光源是逆时针45°。
例5-31:surfl指令应用示例。
创建M文件并命名为ex5_31.m,利用M文件编辑器在M文件中输入:
clear all [X, Y, Z] = peaks(30); subplot(1,2,1); surfl(X, Y, Z),colormap(copper); title('Default Lighting'); shading interp subplot(1,2,2); surfl(X, Y, Z, [-90 30], [0.55 0.6 2 10]); shading interp
运行M文件,结果如图5-33所示。
图5-33 surfl指令运行结果
值得注意的是,插值上色会极大地降低打印速度。这是因为每一像素都有一个不同的颜色值,打印机对每个点都要分别上色。
5.3.5 绘制等值线图
等值线图又叫等高线图。绘制等值线图需要用到contour指令,其调用格式如下。
● contour(Z):以Z矩阵列下标为x轴自变量、行下标为y轴自变量,绘制等值线图。
● contour(Z,n):其中n为所绘制的图形等值线的条数。
● contour(Z,v):其中v为向量,向量的长度为等值线的条数,并且等值线的值为对应的向量的元素值。
● contour(X,Y,Z):以X为x轴自变量、Y为y轴自变量,绘制等值线图;X、Y均为向量,若X、Y长度分别为m、n,则Z为m×n的矩阵,即[m,n]=size(Z),则网格线的顶点为(Xj ,Yi ,Zij)。
● contour(X,Y,Z,n):其中n为所绘制的图形等值线的条数。
● contour(X,Y,Z,v):其中v为向量,向量的长度为等值线的条数,并且等值线的值为对应的向量的元素值。
● surf(…,LineSpec):其中LineSpec用来定义等值线的线型。
与contour作用相类似的指令还有contourf指令,其调用格式与contour指令相同。
例5-32:contour指令使用示例。
创建M文件并命名为ex5_32.m,利用M文件编辑器在M文件中输入:
clear all [X, Y, Z] = peaks(30); figure subplot(2,2,1); contour(X, Y, Z); axis square subplot(2,2,2); contour(X, Y, Z, 10); axis square subplot(2,2,3); contour(X, Y, Z, -10 : 1 : 10); axis square subplot(2,2,4); contour(X, Y, Z, ':'); axis square
运行M文件,结果如图5-34所示。
图5-34 contour指令运行结果