matlab教程 三维图形.doc

上传人:来看看 文档编号:5090153 上传时间:2020-02-01 格式:DOC 页数:38 大小:3.26MB
返回 下载 相关 举报
matlab教程 三维图形.doc_第1页
第1页 / 共38页
matlab教程 三维图形.doc_第2页
第2页 / 共38页
matlab教程 三维图形.doc_第3页
第3页 / 共38页
matlab教程 三维图形.doc_第4页
第4页 / 共38页
matlab教程 三维图形.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《matlab教程 三维图形.doc》由会员分享,可在线阅读,更多相关《matlab教程 三维图形.doc(38页珍藏版)》请在三一文库上搜索。

1、第十八章 三维图形为了显示三维图形,MATLAB提供了各种各样的函数。有一些函数可在三维空间中画线,而另一些可以画曲面与线格框架。另外,颜色可以用来代表第四维。当颜色以这种方式使用时,由于它不再象照片中那样显示信息的自然属性-色彩,而且也不是基本数据的内在属性,所以它称作伪彩色。为了简化对三维图形的讨论,对颜色的介绍推迟到下一章。在这一章,主要讨论绘制三维图形的基本概念。18.1 函数plot3plot3命令将绘制二维图形的函数plot的特性扩展到三维空间。函数格式除了包括第三维的信息(比如Z方向)之外,与二维函数plot相同。plot3一般语法调用格式是plot3(x1,y1,z1,S1,x

2、2,y2,z2,S2,),这里xn,yn和zn是向量或矩阵,Sn是可选的字符串,用来指定颜色、标记符号和/或线形。总的来说,plot3可用来画一个单变量的三维函数。如下为一个三维螺旋线例子: t=0:pi/50:10*pi; plot3(sin(t),cos(t),t) title( Helix ),xlabel( sint(t) ),ylabel( cos(t) ),zlabel( t ) text(0,0,0, Origin ) grid v = axisv = -1 1 -1 1 0 40输出见图18.1.图18.1 螺旋线图从上例可明显看出,二维图形的所有基本特性在三维中仍都存在。ax

3、is命令扩展到三维只是返回Z轴界限(0和40),在数轴向量中增加两个元素。函数zlabel用来指定z轴的数据名称,函数grid在图底绘制三维网格。函数test(x,y,z, string )在由三维坐标x,y,z所指定的位置放一个字符串。另外,子图和多图形窗口可以直接应用到三维图形中。在最后一章可以看到,通过指定plot命令的多个参量或使用hold命令,可以把多条直线或曲线重叠画出。plot3以及其它的三维图形函数都可以提供相同的能力。例如,增加维数的plot3命令可以使多个二维图形沿一个轴排列起来,而不是直接将二维图形叠到另一个的上面。 x=linspace(0,3*pi); % x-axi

4、s data z1=sin(x); % plot in x-z plane z2=sin(2*x); z3=sin(3*x); y1=zeros(size(x); % spread out along y-axis y3=zeros(size(x); % by giving each diffent y-axis values y2=y3/2; plot3(x,y1,z1,x,y2,z2,x,y3,z3); grid,xlabel( x-axis ),ylabel( y-axis ,abel( z-axis ) title( sin(x),sin(2x),sin(3x) )输出见图18.2.图

5、18.2 正弦曲线图上述图形也可以沿另外方向堆列。 plot3(x,z1,y1,x,z2,y2,x,z3,y3) grid,xlabel( x-axis ,ylabel( y-axis ),zlabel( z-axis ) title( sin(x),sin(2x),sin(3x) )输出见图18.3.图18.3 正弦曲线图18.2 改变视角注意两个图形,一个是以30度视角向下看z=0平面,一个是以37.5度视角向上看x=0平面。这是对所有三维图形的缺省视角。与z=0平面所成的方向角叫仰角,与x=0平面的夹角叫做方位角。这样,缺省的三维视角方向仰角为30度,方位角为-37.5度。而缺省的二维视

6、角仰角为90度,方位角为0度。仰角和方位角的概念在图18.4中形象地画出。图18.4 仰角和方位角示意图图18.5 视角举例图在MATLAB中,函数view改变所有类型的二维和三维图形的图形视角。view(az,el)和view(az,el)将视角改变到所指定的方位角az和仰角el。考虑下面脚本M文件形式的例子。% viewpoint example using subplotsx=linspace(0,3*pi).;Z=sin(x) sin(2*x) sin(2*x); % create Y and Z axes as matricesY=zeros(size(x) ones(size(x)

7、/2 ones(size(x);subplot(2,2,1)plot3(x,Y,Z) % plot3 works with column-oriented matrices toogrid,xlabel( X-axis ),ylabel( Y-axis ),zlabel( Z-axis )title( Default Az = -37.5,E1 = 30 )view(-37.5,30)subplot(2,2,2) plot3(x,Y,Z) grid,xlabel( X-axis ),ylabel( Y-axis ),zlabel( Z-axis )title( Az Rotated to 52

8、.5 )view(-37.5+90,30)subplot(2,2,3)plot3(x,Y,Z) grid,xlabel( X-axis ),ylabel( Y-axis ),zlabel( Z-axis )title( E1 Increased to 60 )view(-37.5,60)subplot(2,2,4)plot3(x,Y,Z) grid,xlabel( X-axis ),ylabel( Y-axis )title( Az = 0,E1 = 90 )view(0,90)输出见图18.5。 除了上面的形式,view还提供了综合在表18.1的其它特性:表18.1函数viewview(az

9、,el)将视图设定为方位角az和仰角elview(az,el)view(x,y,z)在笛卡儿坐标系中将视图设为沿向量x,y,z指向原点,例如view(0 0 1)=view(0,90)view(2)设置缺省的二维视角,az=0,el=90view(3)设置缺省的三维视角,az=-37.5,el=30az,el=view返回当前的方位角az和仰角elview(T)用一个44的转矩阵T来设置视图角T=view返回当前的44转矩阵最后,为了演示MATLAB句柄图形能力,精通MATLAB工具箱包含了函数mmview3d。在产生二维或三维图形后调用此函数, mmview3d,在当前图形中放置水平角和方位

10、角滑标(滚动条)以设置视角。使用函数mmview3d的更详细的信息见在线帮助。18.3 两个变量的标量函数相对于plot3产生的线条图形,经常希望画出两个变量的标量函数,比如:z=f(x,y)这里每一对x与y的值产生一个z的值。它作为x与y的函数,是三维空间中的一个曲面。为了在MATLAB里画出这个曲面,z的值存放在一个矩阵中。象在*二维插值这一节所描述的那样,给出x与y的值作为独立的变量,z是因变量矩阵,x、y与z的联系就是:z(i,:)=f(x,y(i) and z(:,j)=f(x(j),y)即z的第i行与的y第i个元素相关,而z的第j列与x的第个j元素相关。或者说,y沿着z的列变化,而

11、x沿着z的行变化。当z=f(x,y)能简化表示时,可以方便地用数组运算在单个语句中算出z的所有的值。这样做,要求我们以合适的方向创建所有x与y值的矩阵。(这种方向有时被Mathwork公司称作为方格)。MATLAB提供了函数meshgrid来执行这个步骤。 x=-3:3; % choose x-axisd values y=1:5; % y-axis values X,Y=meshgrid(x,y)X = -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3Y = 1 1 1 1

12、 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5如上所见,函数meshgrid对y中行的每一行复制x,同样也对x中列的每一列复制y。这种方向与前面语句相一致,即y向下改变其列,而x横跨改变其行。给定X和Y,如果z=f(x,y)=(x+y)2,那么z便定义一个三维曲面的数据矩阵: Z=(X+Y).2Z = 4 1 0 1 4 9 16 1 0 1 4 9 16 25 0 1 4 9 16 25 36 1 4 9 16 25 36 49 4 9 16 25 36 49 64当函数不能象上面那样简单表示出来时,便只能用 Fo

13、r 循环或 While 循环来计算Z的元素。在很多情况下,有可能按行或按列计算Z。例如,如果能按行计算Z,下面的脚本文件段会很有帮助:x=? % statement defining vector of x-axis valuesy=? % statement defining vector of y-axis valuesnx=length(x); % length of x is no. of rows in Zny=length(y); % length of y is no. of columns in ZZ=zeros(nx,ny); % initialize Z matrix fo

14、r speedfor r=1:nxpreliminary commandsZ(r,:)=a function of y and x(r) defining r-th row of Zend相反,如果能按列计算Z,下面的脚本文件段会很有帮助:x=? % statement defining vector of x-axis valuesy=? % statement defining vector of y-axis valuesnx=length(x); % length of x is no. of rows in Zny=length(y); % length of y is no. of

15、 columns in ZZ=zeros(nx,ny); % initialize Z matrix for speedfor c=1:nypreliminary commandsZ(:,c)=a function of y(c) and x defining c-th column of Zend只有当Z中的元素必须一个一个地计算时,就常常要求象下面的脚本文件一样,用嵌套循环进行计算。x=? % statement defining vector of x-axis valuesy=? % statement defining vector of y-axis valuesnx=length

16、(x); % length of x is no. of rows in Zny=length(y); % length of y is no. of columns in ZZ=zeros(nx,ny); % initialize Z matrix for speedfor r=1:nxfor c=1:nypreliminary commandsZ(r,c)=a function of y(c) and x(r) defining Z(r,c)endend18.4 杂乱或散射数据的插值在有些情况下,两个变量的标量函数的值,如z=f(x,y),不能简单地算出。这是因为要么x和y的值是非均匀间隔

17、的(最坏时是随机分布),要么是用了不同的坐标系,比如非长方形的网格。出现这些情况时,MATLAB中的函数griddata就用来产生经插值后的均匀间隔数据以作图。首先考虑前面的例子。假设要求较高的分辨率,但我们不想重新计算函数来得到新值。 x=-3:3; % original x-axis values y=1:5; % original y-axis values X,Y=meshgrid(x,y); % create plaid data matrices Z=(X+Y).2; % original z values size(Z) % original array sizeans = 5

18、7 xi=-3:.5:4; % interpolated x-axis values length(xi) % get new x-axis lengthans = 15 yi=0:.2:5; % interpolated y-axis values length(yi) % get new y-axis lengthans = 26 Xi,Yi=meshgrid(xi,yi); % make new data plaid Zi=griddata(X,Y,Z,Xi,Yi); % interpolated Z data using original data size(Zi) % interpo

19、lated size is correctans = 26 15这里函数griddata用三个原始矩阵X,Y,Z和需要插值的方格矩阵,创建一个新的因变量矩阵Zi。要注意插值不必在原始数据的范围内,比如x在-3与3间变化,而xi在-3与4间变化。与第11章里所述的二维插值相对应,griddata对于数据非单调或不规则分布的情况也同样有效。例如,考虑随机数据: x=2*rand(1,20); % nonmonotonic x-axis y=4*rand(1,20)-2; % nonmonotonic y-axis X,Y=meshgrid(x,y); % make data plaid Z=(X+

20、Y).2; % compute function xi=linspace(0,2,50); % interpolated monotonic x-axis values yi=linspace(-2,2,30); % interpolated monotonic y-axis values Xi,Yi=meshgrid(xi,yi); % make data plaid Zi=griddata(X,Y,Z,Xi,Yi); % interpolated on monotonic plaid data这里,对随机数据插值给出更适合于作图的单调数据。这对于本章后面讨论的等值线图特别重要,因为它要求数

21、据定义在均匀间隔的网格中。在上面的两个例子中,较容易对所需的插值重新计算函数。作为一般规则,如果容易计算出感兴趣的函数,就要避免使用函数griddata。而当感兴趣的点的函数不可得到或需要很大的计算量时,函数griddata提供了一个工具,以均匀分布的内插数据点,对基本函数进行估计。18.5 网格图利用在xy平面的矩形网格点上的z轴坐标值,MATLAB定义了一个网格曲面。MATLAB通过将邻接的点用直线连接起来形成网状曲面,其结果好象在数据点有结点的鱼网。例如,用MATLAB的函数Peaks可以画一个简单的曲面。 X,Y,Z=peaks(30); mesh(X,Y,Z) grid,xlabel

22、( x-axis ),ylabel( y-axis ),zlabel( z-axis ) title( MESH of PEAKS )输出见图18.6.图18.6 函数PEAKS的网格图在显示器上要注意到线的颜色与网格的高度有关。一般情况下,函数mesh有可选的参量来控制绘图中所用的颜色。关于MATLAB如何使用、改变颜色在下一章讨论。在任何情况下,由于颜色用于增加图形有效的第四维,这样使用的颜色被称做伪彩色。除了上例中的输入参量,函数mesh和大多数三维绘图函数都可按多种输入参量调用。这里所用的句法是最详细的,它给出了所有三个坐标轴的信息。最通常的变更方法是使用向量,将它传递给meshgri

23、d,生成x与y坐标轴,比如mesh(x,y,z)。有关其它调用语法形式的信息,参阅MATLAB参考指南或在线帮助。如上图所示,网格线条之间的区域是不透明的。MATLAB命令hidden控制网格图的这个特性。比如,用MATLAB的函数sphere产生两个球面如下: X,Y,Z=sphere(12); subplot(1,2,1) mesh(X,Y,Z),title( Opaque ) hidden on axis off subplot(1,2,2),title( Transparent ) mesh(X,Y,Z) hidden off axis off输出见图18.7.不透明 透明图18.7左

24、边的球是不透明的(线被隐蔽),而右边的球是透明的(线未被隐蔽)。 MATLAB的mesh有两个同种函数:meshc,它画网格图和基本的等值线图;meshz,它画包含零平面的网格图。 X,Y,Z=peaks(30); meshc(X,Y,Z) % mesh plot with underlying contour plot title( MESHC of PEAKS ) meshz(X,Y,Z) % mesh plot with zero plane tiTle( MESH of PEAKS ) title( MESH of PEAKS ) hidden off % make mesh tran

25、sparent so minimums can be seen输出分别见图18.8和图18.9.图18.8 函数PEAKS的网格图和基本等值线图图18.9 函数PEAKS的带零平面的网格图关于以上函数更详细的信息参阅MATLAB参考指南或使用在线帮助。18.6 曲面图曲面图,除了各线条之间的空档(称作补片)用颜色填充以外,和网格图看起来是一样的。这种图一般使用函数surf来绘制。自然,函数surf使用和函数mesh相同的调用语法。比如: X,Y,Z=peaks(30); surf(X,Y,Z) grid,xlabel( x-axis ),ylabel( y-axis ),zlabel( z-a

26、xis ) title( SURF of PEAKS )输出见图18.10.图18.10 函数PEAKS的曲面图曲面图的一些特性正好和网格图相反:它的线条是黑色的,线条之间的补片有颜色;而在网格图里,补片是黑色的而线条有颜色。对函数mesh,颜色沿着z轴按每一补片变化,而线条颜色不变。在曲面图里,人们不必考虑象网格图一样隐蔽线条,但要考虑用不同的方法对表面加色彩。在前面的曲面图的例子中,就是分割成块,每块就象一块染色玻璃窗口或物体,黑线便是各单色染色玻璃块之间的连接。除此以外,MATLAB还提供了平滑加颜色和插值加颜色功能。这可以通过调用函数shading来实现。 X,Y,Z=peaks(30

27、); surf(X,Y,Z) % same plot as above grid,xlabel( x-axis ),ylabel( y-axis ),zlabel( z-axis ) title( SURF of PEAKS ) shading flat输出见图18.11.图18.11 函数PEAKS的平滑加彩色曲面图如上所示平滑加色彩的例子中,每一补片仍保存着单一的颜色,但各块连接处的黑线已去掉。 shading interp输出见图18.12.图18.12 函数PEAKS的插值加彩色曲面图如上所示内插加色彩的例子中,同样去掉了线条,但各补片以插值加颜色,即各补片的颜色根据赋予顶点的色值,对

28、其区间进行了插值计算。很明显,插值色彩需要比分块和平滑更多的计算量。在一些计算机系统中,插值色彩会产生非常长的打印延时或打印错误。这问题不在于PostScript文件太大,而是由于在打印机上产生沿图形曲面连续变化的阴影所需的巨大计算量。通常对这个问题最简单的解决方法是使用平滑加色彩法来打印。色彩对surf作图的视觉效果有着巨大的影响。对网格图也是如此,尽管由于只有线条有颜色,对视觉效果的影响相对要小一些。因为曲面图不能作成透明,但在一些情况下可以很方便地移走一部分表面以便看到表面以下部分,在MATLAB中,这是通过在所期望的洞孔的所在位置,将数据置为特定的NaN来实现。由于NaN没有任何值,所

29、有的MATLAB作图函数都忽略NaN的数据点,在该点出现的地方留下一个洞孔。例子如下: X,Y,Z=peaks(30); x=X(1,:); % vector of x axis y=Y(:,1); % vector of y axis i=find(y.8 & y-.6 & x.5); % find x-axis indices of hole Z(i,j)=nan*Z(i,j); % set values at hole indices to NaNs surf(X,Y,Z) grid,xlabel( x-axis ),ylabel( y-axis ),zlabel( z-axis ) t

30、itle( SURF of PEAKS with a Hole )输出见图18.13.图18.13 函数PEAKS的带洞孔曲面图MATLAB的surf也有两个同种函数:surfc,它画出具有基本等值线的曲面图;surfl,它画出一个有亮度的曲面图。例如: X,Y,Z=peaks(30); surfc(X,Y,Z) % surf plot with contour plot grid,xlabel( x-axis ),ylabel( y-axis ),zlabel( z-axis ) title( SURFC of PEAKS )输出见图18.14.图18.14 函数PEAKS的曲面图和基本等值

31、线图 X,Y,Z=peaks(30); surfl (X,Y,Z) % surf plot with lighting shading interp % surfl plots look best with interp shading colormap pink % they also look better with shades of a single color grid,xlabel( X-axis ),ylabel( Y-axis ),zlabel( Z-axis )title( SURFL OF PEAKS )输出见图18.14.图18.16 函数PEAKS的带光线照明曲面图关于

32、加到曲面的亮度,函数surfl作了许多假设。有关设置亮度属性的详细信息参阅MATLAB参考指南的函数surfl或使用在线帮助。同样,在上面执行的命令中,colormap是MATLAB函数,它对图形施加一套不同的颜色。这个函数在下一章讨论。18.7 等值线图 MATLAB提供了另一种基本的三维图形,即三维等值线图。这种图形通过函数contour3来绘制。 x,y,z=peaks(30); contour3(X,Y,Z,16) % draw sixteen contour lines grid,xlabel( x-axis ),ylabel( y-axis ),zlabel( z-axis ) t

33、itle( CONTOUR3 of PEAKS )输出见图18.16.图18.16 函数PEAKS的三维等值线图可以看到,图形中每一条线的颜色遵循了与二维函数plot一样的次序。这种颜色次序可以表现出明显的对比,但经常模糊了所代表的数据的一些重要特性。如果能使每一条线遵循在网格图和曲面图里所用的加色方法,那么效果会好得多。也许在MATLAB的下一个版本中,这种颜色设置会成为缺省设置,但使用在下一章要讨论的MATLAB图形处理能力,也能解决这个问题。 X,Y,Z=peaks(30); N=16; % number of contour lines and their colors clf % c

34、lear the current figure view(3) % set view to 3-D hold on % hold blank screen set(gca, ColorOrder ,hsv(N) % use colors from default hsv colormap contour3(X,Y,Z,N) % draw N contour lines grid,xlabel( X-axis ),ylabel( Y-axis ),zlabel( Z-axis ) title( CONTOUR3 of PEAKS ) hold off 输出见图18.17.图18.17 函数PEA

35、KS的三维等值线图现在,各条等值线的颜色沿着z轴的变化和网格图和曲面图一样。为方便起见,这种策略已体现在精通MATLAB工具箱的函数mmcont3中。mmcont3具有和函数contour3相同的调用语法的变化,并允许选择可用的颜色映象。例如, mmcont3(X,Y,Z,N,hsv)复制上面的图形。mmcont3的在线帮助如下: help mmcont3MMCONT3 3-Dcontour plot using a colormapMMCONT3(X,Y,Z,N,C) plots N contours of Z in 3-D using the color specified in C.C

36、can be a linestyle and color as used in plot,e.g., r- ,or C can be the string name of a colormap.X and Y.define the axis limits.If not given default argument values are :N=10 ,C= hot ,X and Y=row and column indices of Z.Examples:MMCONT3(Z)10 lines with hot colormapMMCONT3(Z,20)20 lines with hot colo

37、rmapMMCONT3(Z, copper )10 lines with copper colormapMMCONT3(Z,20, gray )20 lines with gray colormapMMCONT3(X,Y,Z, jet )10 lines with jet colormapMMCONT3(Z, c- )10 dashed lines in cyanMMCONT3(X,Y,Z,25, pink )25 lines in pink colormapCS=MMCONT3( . . .) returns the contour matrix CS as described in CON

38、TOURC.CS,H=MMCONT3( . . .) returns a column vector H of handles to line objects帮助信息:MMCONT3(X,Y,Z,N,C)用由C指定的颜色在三维空间内画N条Z方向的等值线图。C可以是在plot中使用的线形和颜色,例如 r- ;或者C可以是一个颜色映象的字符串名。X和Y指定了坐标轴的范围。如果未指定参数,缺省的参数值是:N=10,C= hot ,X和Y分别是Z的行和列的下标。举例:MMCONT3(Z) 用暖色映象画10条等值线MMCONT3(Z,20) 用暖色映象画20条等值线MMCONT3(Z, copper )

39、 用铜黄色映象画10条等值线MMCONT3(Z,20, gray ) 用灰色映象画20条等值线MMCONT3(X,Y,Z, jet ) 用*jet暖色映象画10条等值线MMCONT3(Z, c- ) 画10条青蓝色的虚划线等值线MMCONT3(X,Y,Z,25, pink ) 用粉红色映象画25条等值线CS=MMCONT3() 如在CONTOURC中描述,返回等值线矩阵CS。CS,H=MMCONT3() 把句柄的列向量H返回到线条对象。等值线也可由一种颜色给出: x,y,z=peaks(30); contour3(X,Y,Z,16, y ) % draw sixteen contour lin

40、es in yellow grid,xlabel( x-axis ),ylabel( y-axis ),zlabel( z-axis ) title( CONTOUR3 of PEAKS )输出见图18.18图18.18 函数PEAKS的黄色三维等值线图关于颜色使用的详细信息参阅下一章;以上函数使用的详细信息参阅MATLAB参考指南或使用在线帮助。18.8 三维数据的二维图有些情况下,希望得到三维数据的二维表示。在MATLAB里这一点是通过用函数view设置视角使其中一维不出现来实现的。另外,MATLAB还提供了两个函数,将contour3和surf向下正视到xy平面。例如,函数contour3的二维图就等价于contour。 X,Y,Z=peaks(30); contour(X,Y,Z,16) % draw sixteen contour lines xlabel( X-axis ),ylabel( Y-axis ) title( CONTOUR of PEAKS )输出见图18.19图18.19 函数PEAKS的等值线图要注意,它如何等效于使用contour3以及如何改变视点俯视到xy平面。如同contour3,图中的等值线利用plot命令的六种基本颜色。如前所述,因为颜色不提供视觉效果,这类图形不好使用并且引起混淆。这

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 绩效管理


经营许可证编号:宁ICP备18001539号-1