13 MATLAB 三维图形绘制

在实际工程应用中,常常遇到三维甚至更多维的数据,需要在图形中表示出来,MATLAB中提供了相应的三维图形 绘制功能,这些绘制功能与二维图形的绘制十分类似,特别是曲线的属性,例如线型、颜色等的设置,是完全相同的。最常用的三维绘图有三维曲线图、三维网格图和三维曲面图这3中基本类型,相应的MATLAB指令分别为plot3,mesh和surf。


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所规定的曲线属性下,绘制三维曲线。


plot3(x1,y1,z1,‘ProtertyName1’,PropertyValue1...,x2,y2,z2,‘PropertyName2’,PropertyValue2....);


示例:

 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)

13 MATLAB 三维图形绘制_第1张图片


例2:

theta=0:0.01*pi:2*pi;
x1=sin(theta);
y1=cos(theta);
z1=cos(4*theta);
 x2=sin(2*theta);
 y2=cos(3*theta);
 z2=cos(5*theta);
 figure

plot3(x1,y1,z1,'rd',x2,y2,z2,'g^','LineWidth',2);

13 MATLAB 三维图形绘制_第2张图片






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为mXn的矩阵,即[m,n]=size(Z),则网格线的顶点为  (Xj,Yi,Zi,j)。

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):ProteryValue用来定义网格图的标记等属性。


示例:

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);

13 MATLAB 三维图形绘制_第3张图片




3.曲面图的绘制

曲面图的绘制由surf指令完成,该指令的调用格式与mesh指令类似,具体如下:

surf(X,Y,Z)

surf(Z)

surf(X,Y,Z,C)

surf(X,Y,Z,‘PropertyName’,ProtertyValue)

mesh指令过绘制的图形是网格划分的曲面图,而surf指令绘制得到的是平滑着色的三维曲面图,着色的方式是在得到相应的网格点后,对每一个网格依据该网格所代表的节点的色值(由变量C控制)来定义这一网格的颜色。


[x,y,z]=peaks(25); %峰函数,peaks(25)是产生25×25的guassian分布矩阵
>> figure
>> surf(x,y,z);
>> title('surf曲面绘制')
>> figure
>> mesh(x,y,z);
>> title('mesh网格绘制')

13 MATLAB 三维图形绘制_第4张图片

13 MATLAB 三维图形绘制_第5张图片



4.光照模型

光照是一种利用方向光源照亮物体的技术,在某些情况下,这项技术能使表面微妙的差异更容易看到,光照也能用来对三维的图形增加现实感。


示例

 x=-10:0.1:10;

y=-10:0.1:10;
 [X,Y]=meshgrid(x,y);
Z=-X.^2-Y.^2+200;

figure
surf(X,Y,Z,'FaceColor','red','EdgeColor','none');     %'FaceColor','red'曲面涂上红色,边缘无色

%一个发光的物体被加到了“镜头”的左边(即从空间观看时所在的表面的位置)

camlight left;


%设置照明方式为phong模型,

lighting phong         

%view命令改变视角

 view(-15,65)



13 MATLAB 三维图形绘制_第6张图片


MATLAB中内置了surfl函数,可以画出类似于函数surf产生的带彩色的曲面,原理是基于运用漫反射、镜面发射光和环境照明模型。使用一个单色颜色映像(如灰色,纯白,铜黄或粉红色)和插值色彩,会画出效果更好的曲面,语法格式如下:

surfl(X,Y,Z,S):其中S以[Sx,Sy,Sz]或[az,el]的形式定义光源方向,在没有定义的情况下,其默认光源是逆时针45度。


例:

 [X,Y,Z]=peaks(30);      %峰函数,peaks(30)是产生30×30的guassian分布矩阵
subplot(1,2,1);

surfl(X,Y,Z)  


%colormap设定和获取当前色图的函数,colormap(copper)设定当前色图,copper 从黑色平滑过渡到亮铜色。

colormap(copper);
title('Default Lighting');
shading interp

%shading interp 会区分每个线形区域的颜色,并且插入与其相近的颜色。插值上色会极大地降低打印速度,

%这是因为每一个像素都有一个不同的颜色值,打印机对每个点要分别上色


subplot(1,2,2);surfl(X,Y,Z,[-90 30],[.55 .6 2 10]);

%[-90 30]指定光源与曲面的方位,如果没有定义,默认光源是逆时针45度

%[0.55 0.5 2 10]指定反射系数,分别为环境光系数,漫反射系数,镜面反射系数,镜面发射亮度(以像素为单位)。缺省时默认为[0.55 0.6 0.4 0]

shading interp


13 MATLAB 三维图形绘制_第7张图片



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为mXn的矩阵,即[m,n]=size(Z),则网格线的顶点为(Xj,Yi,Zij)。

contour(X,Y,Z,n):其中的n为所绘制的图形等值线的条数。

contour(X,Y,Z,v):其中的v为向量,向量的长度为等值线的条数,并且等值线的值为对应的向量的元素值。

contour(.....,'LineSpace'):LineSpace用来定义等值线的线型。

与contour作用类似的指令还有contourf指令,其调用格式与contour相同。


例:

 [X,Y,Z]=peaks(30);
>> figure
>> subplot(2,2,1);contour(X,Y,Z);
>> subplot(2,2,2);contour(X,Y,Z,10);  %画出10条等值线
>> subplot(2,2,3);contour(X,Y,Z,-10:1:10); % 画出20条等值线,并且等值线的值为-10,-9,........,9,10
>> subplot(2,2,4);contour(X,Y,Z,':');  %  指定线型为点线
13 MATLAB 三维图形绘制_第8张图片


你可能感兴趣的:(MATLAB基础知识)