matlab第十八章三维图形.docx

上传人:b****4 文档编号:3807476 上传时间:2023-05-06 格式:DOCX 页数:34 大小:343.34KB
下载 相关 举报
matlab第十八章三维图形.docx_第1页
第1页 / 共34页
matlab第十八章三维图形.docx_第2页
第2页 / 共34页
matlab第十八章三维图形.docx_第3页
第3页 / 共34页
matlab第十八章三维图形.docx_第4页
第4页 / 共34页
matlab第十八章三维图形.docx_第5页
第5页 / 共34页
matlab第十八章三维图形.docx_第6页
第6页 / 共34页
matlab第十八章三维图形.docx_第7页
第7页 / 共34页
matlab第十八章三维图形.docx_第8页
第8页 / 共34页
matlab第十八章三维图形.docx_第9页
第9页 / 共34页
matlab第十八章三维图形.docx_第10页
第10页 / 共34页
matlab第十八章三维图形.docx_第11页
第11页 / 共34页
matlab第十八章三维图形.docx_第12页
第12页 / 共34页
matlab第十八章三维图形.docx_第13页
第13页 / 共34页
matlab第十八章三维图形.docx_第14页
第14页 / 共34页
matlab第十八章三维图形.docx_第15页
第15页 / 共34页
matlab第十八章三维图形.docx_第16页
第16页 / 共34页
matlab第十八章三维图形.docx_第17页
第17页 / 共34页
matlab第十八章三维图形.docx_第18页
第18页 / 共34页
matlab第十八章三维图形.docx_第19页
第19页 / 共34页
matlab第十八章三维图形.docx_第20页
第20页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

matlab第十八章三维图形.docx

《matlab第十八章三维图形.docx》由会员分享,可在线阅读,更多相关《matlab第十八章三维图形.docx(34页珍藏版)》请在冰点文库上搜索。

matlab第十八章三维图形.docx

matlab第十八章三维图形

第十八章三维图形

为了显示三维图形,MATLAB提供了各种各样的函数。

有一些函数可在三维空间中画线,而另一些可以画曲面与线格框架。

另外,颜色可以用来代表第四维。

当颜色以这种方式使用时,由于它不再象照片中那样显示信息的自然属性----色彩,而且也不是基本数据的内在属性,所以它称作伪彩色。

为了简化对三维图形的讨论,对颜色的介绍推迟到下一章。

在这一章,主要讨论绘制三维图形的基本概念。

18.1函数plot3

plot3命令将绘制二维图形的函数plot的特性扩展到三维空间。

函数格式除了包括第三维的信息(比如Z方向)之外,与二维函数plot相同。

plot3一般语法调用格式是plot3(x1,y1,z1,S1,x2,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=axis

v=

-11-11040

输出见图18.1.

图18.1螺旋线图

从上例可明显看出,二维图形的所有基本特性在三维中仍都存在。

axis命令扩展到三维

只是返回Z轴界限(0和40),在数轴向量中增加两个元素。

函数zlabel用来指定z轴的数据名称,函数grid在图底绘制三维网格。

函数test(x,y,z,‘string‘在由三维坐标x,y,z所指定的位置放一个字符串。

另外,子图和多图形窗口可以直接应用到三维图形中。

在最后一章可以看到,通过指定plot命令的多个参量或使用hold命令,可以把多条直线或曲线重叠画出。

plot3以及其它的三维图形函数都可以提供相同的能力。

例如,增加维数的plot3命令可以使多个二维图形沿一个轴排列起来,而不是直接将二维图形叠到另一个的上面。

»x=linspace(0,3*pi;%x-axisdata

»z1=sin(x;%plotinx-zplane

»z2=sin(2*x;

»z3=sin(3*x;

»y1=zeros(size(x;%spreadoutalongy-axis

»y3=zeros(size(x;%bygivingeachdiffenty-axisvalues

»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.

图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度。

而缺省的二维视角仰角为90度,方位角为0度。

仰角和方位角的概念在图18.4中形象地画出。

图18.4仰角和方位角示意图

图18.5视角举例图

在MATLAB中,函数view改变所有类型的二维和三维图形的图形视角。

view(az,el和view([az,el]将视角改变到所指定的方位角az和仰角el。

考虑下面脚本M文件形式的例子。

 

%viewpointexampleusingsubplots

x=linspace(0,3*pi.’;

Z=[sin(xsin(2*xsin(2*x];%createYandZaxesasmatrices

Y=[zeros(size(xones(size(x/2ones(size(x];

subplot(2,2,1

plot3(x,Y,Z%plot3workswithcolumn-orientedmatricestoo

grid,xlabel(‘X-axis‘,ylabel(‘Y-axis‘,zlabel(‘Z-axis‘

title(‘DefaultAz=-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(‘AzRotatedto52.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(‘E1Increasedto60‘

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

函数view

view(az,el

将视图设定为方位角az和仰角el

view([az,el]

 

view([x,y,z]

在笛卡儿坐标系中将视图设为沿向量[x,y,z]指向原点,例如view([001]=view(0,90

view(2

设置缺省的二维视角,az=0,el=90

view(3

设置缺省的三维视角,az=-37.5,el=30

[az,el]=view

返回当前的方位角az和仰角el

view(T

用一个4×4的转矩阵T来设置视图角

T=view

返回当前的4×4转矩阵

最后,为了演示MATLAB句柄图形能力,精通MATLAB工具箱包含了函数mmview3d。

在产生二维或三维图形后调用此函数,»mmview3d,在当前图形中放置水平角和方位角滑标(滚动条)以设置视角。

使用函数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(iandz(:

j=f(x(j,y

即z的第i行与的y第i个元素相关,而z的第j列与x的第个j元素相关。

或者说,y沿着z的列变化,而x沿着z的行变化。

当z=f(x,y能简化表示时,可以方便地用数组运算在单个语句中算出z的所有的值。

这样做,要求我们以合适的方向创建所有x与y值的矩阵。

(这种方向有时被Mathwork公司称作为方格。

MATLAB提供了函数meshgrid来执行这个步骤。

»x=-3:

3;%choosex-axisdvalues

»y=1:

5;%y-axisvalues

»[X,Y]=meshgrid(x,y

X=

-3-2-10123

-3-2-10123

-3-2-10123

-3-2-10123

-3-2-10123

Y=

1111111

2222222

3333333

4444444

5555555

如上所见,函数meshgrid对y中行的每一行复制x,同样也对x中列的每一列复制y。

这种方向与前面语句相一致,即y向下改变其列,而x横跨改变其行。

给定X和Y,如果z=f(x,y=(x+y2,那么z便定义一个三维曲面的数据矩阵:

»Z=(X+Y.^2

Z=

41014916

101491625

0149162536

14916253649

491625364964

当函数不能象上面那样简单表示出来时,便只能用For循环或While循环来计算Z的元素。

在很多情况下,有可能按行或按列计算Z。

例如,如果能按行计算Z,下面的脚本文件段会很有帮助:

x=?

?

?

%statementdefiningvectorofx-axisvalues

y=?

?

?

%statementdefiningvectorofy-axisvalues

nx=length(x;%lengthofxisno.ofrowsinZ

ny=length(y;%lengthofyisno.ofcolumnsinZ

Z=zeros(nx,ny;%initializeZmatrixforspeed

forr=1:

nx

{preliminarycommands}

Z(r,:

={afunctionofyandx(rdefiningr-throwofZ}

end

相反,如果能按列计算Z,下面的脚本文件段会很有帮助:

x=?

?

?

%statementdefiningvectorofx-axisvalues

y=?

?

?

%statementdefiningvectorofy-axisvalues

nx=length(x;%lengthofxisno.ofrowsinZ

ny=length(y;%lengthofyisno.ofcolumnsinZ

Z=zeros(nx,ny;%initializeZmatrixforspeed

forc=1:

ny

{preliminarycommands}

Z(:

c={afunctionofy(candxdefiningc-thcolumnofZ}

end

只有当Z中的元素必须一个一个地计算时,就常常要求象下面的脚本文件一样,用嵌套循环进行计算。

x=?

?

?

%statementdefiningvectorofx-axisvalues

y=?

?

?

%statementdefiningvectorofy-axisvalues

nx=length(x;%lengthofxisno.ofrowsinZ

ny=length(y;%lengthofyisno.ofcolumnsinZ

Z=zeros(nx,ny;%initializeZmatrixforspeed

forr=1:

nx

forc=1:

ny

{preliminarycommands}

Z(r,c={afunctionofy(candx(rdefiningZ(r,c}

end

end

18.4杂乱或散射数据的插值

在有些情况下,两个变量的标量函数的值,如z=f(x,y,不能简单地算出。

这是因为要么x和y的值是非均匀间隔的(最坏时是随机分布),要么是用了不同的坐标系,比如非长方形的网格。

出现这些情况时,MATLAB中的函数griddata就用来产生经插值后的均匀间隔数据以作图。

首先考虑前面的例子。

假设要求较高的分辨率,但我们不想重新计算函数来得到新值。

»x=-3:

3;%originalx-axisvalues

»y=1:

5;%originaly-axisvalues

»[X,Y]=meshgrid(x,y;%createplaiddatamatrices

»Z=(X+Y.^2;%originalzvalues

»size(Z%originalarraysize

ans=

57

»xi=-3:

.5:

4;%interpolatedx-axisvalues

»length(xi%getnewx-axislength

ans=

15

»yi=0:

.2:

5;%interpolatedy-axisvalues

»length(yi%getnewy-axislength

ans=

26

»[Xi,Yi]=meshgrid(xi,yi;%makenewdataplaid

»Zi=griddata(X,Y,Z,Xi,Yi;%interpolatedZdatausingoriginaldata

»size(Zi%interpolatedsizeiscorrect

ans=

2615

这里函数griddata用三个原始矩阵X,Y,Z和需要插值的方格矩阵,创建一个新的因变量矩阵Zi。

要注意插值不必在原始数据的范围内,比如x在-3与3间变化,而xi在-3与4间变化。

与第11章里所述的二维插值相对应,griddata对于数据非单调或不规则分布的情况也同样有效。

例如,考虑随机数据:

»x=2*rand(1,20;%nonmonotonicx-axis

»y=4*rand(1,20-2;%nonmonotonicy-axis

»[X,Y]=meshgrid(x,y;%makedataplaid

»Z=(X+Y.^2;%computefunction

»xi=linspace(0,2,50;%interpolatedmonotonicx-axisvalues

»yi=linspace(-2,2,30;%interpolatedmonotonicy-axisvalues

»[Xi,Yi]=meshgrid(xi,yi;%makedataplaid

»Zi=griddata(X,Y,Z,Xi,Yi;%interpolatedonmonotonicplaiddata

这里,对随机数据插值给出更适合于作图的单调数据。

这对于本章后面讨论的等值线图特别重要,因为它要求数据定义在均匀间隔的网格中。

在上面的两个例子中,较容易对所需的插值重新计算函数。

作为一般规则,如果容易计算出感兴趣的函数,就要避免使用函数griddata。

而当感兴趣的点的函数不可得到或需要很大的计算量时,函数griddata提供了一个工具,以均匀分布的内插数据点,对基本函数进行估计。

18.5网格图

利用在x-y平面的矩形网格点上的z轴坐标值,MATLAB定义了一个网格曲面。

MATLAB通过将邻接的点用直线连接起来形成网状曲面,其结果好象在数据点有结点的鱼网。

例如,用MATLAB的函数Peaks可以画一个简单的曲面。

»[X,Y,Z]=peaks(30;

»mesh(X,Y,Z

»grid,xlabel(‘x-axis‘,ylabel(‘y-axis‘,zlabel(‘z-axis‘

»title(‘MESHofPEAKS‘

输出见图18.6.

图18.6函数PEAKS的网格图

 

在显示器上要注意到线的颜色与网格的高度有关。

一般情况下,函数mesh有可选的参量来控制绘图中所用的颜色。

关于MATLAB如何使用、改变颜色在下一章讨论。

在任何情况下,由于颜色用于增加图形有效的第四维,这样使用的颜色被称做伪彩色。

除了上例中的输入参量,函数mesh和大多数三维绘图函数都可按多种输入参量调用。

这里所用的句法是最详细的,它给出了所有三个坐标轴的信息。

最通常的变更方法是使用向量,将它传递给meshgrid,生成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‘

»hiddenon

»axisoff

»subplot(1,2,2,title(‘Transparent‘

»mesh(X,Y,Z

»hiddenoff

»axisoff

输出见图18.7.

不透明透明

图18.7

左边的球是不透明的(线被隐蔽),而右边的球是透明的(线未被隐蔽)。

MATLAB的mesh有两个同种函数:

meshc,它画网格图和基本的等值线图;meshz,它画包含零平面的网格图。

»[X,Y,Z]=peaks(30;

»meshc(X,Y,Z%meshplotwithunderlyingcontourplot

»title(‘MESHCofPEAKS‘

»meshz(X,Y,Z%meshplotwithzeroplane

»tiTle(‘MESHofPEAKS‘

»title(‘MESHofPEAKS‘

»hiddenoff%makemeshtransparentsominimumscanbeseen

输出分别见图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-axis‘

»title(‘SURFofPEAKS‘

输出见图18.10.

图18.10函数PEAKS的曲面图

曲面图的一些特性正好和网格图相反:

它的线条是黑色的,线条之间的补片有颜色;而在网格图里,补片是黑色的而线条有颜色。

对函数mesh,颜色沿着z轴按每一补片变化,而线条颜色不变。

在曲面图里,人们不必考虑象网格图一样隐蔽线条,但要考虑用不同的方法对表面加色彩。

在前面的曲面图的例子中,就是分割成块,每块就象一块染色玻璃窗口或物体,黑线便是各单色染色玻璃块之间的连接。

除此以外,MATLAB还提供了平滑加颜色和插值加颜色功能。

这可以通过调用函数shading来实现。

»[X,Y,Z]=peaks(30;

»surf(X,Y,Z%sameplotasabove

»grid,xlabel(‘x-axis‘,ylabel(‘y-axis‘,zlabel(‘z-axis‘

»title(‘SURFofPEAKS‘

»shadingflat

输出见图18.11.

图18.11函数PEAKS的平滑加彩色曲面图

如上所示平滑加色彩的例子中,每一补片仍保存着单一的颜色,但各块连接处的黑线已去掉。

»shadinginterp

输出见图18.12.

图18.12函数PEAKS的插值加彩色曲面图

如上所示内插加色彩的例子中,同样去掉了线条,但各补片以插值加颜色,即各补片的颜色根据赋予顶点的色值,对其区间进行了插值计算。

很明显,插值色彩需要比分块和平滑更多的计算量。

在一些计算机系统中,插值色彩会产生非常长的打印延时或打印错误。

这问题不在于PostScript文件太大,而是由于在打印机上产生沿图形曲面连续变化的阴影所需的巨大计算量。

通常对这个问题最简单的解决方法是使用平滑加色彩法来打印。

色彩对surf作图的视觉效果有着巨大的影响。

对网格图也是如此,尽管由于只有线条有颜色,对视觉效果的影响相对要小一些。

因为曲面图不能作成透明,但在一些情况下可以很方便地移走一部分表面以便看到表面以下部分,在MATLAB中,这是通过在所期望的洞孔的所在位置,将数据置为特定的NaN来实现。

由于NaN没有任何值,所有的MATLAB作图函数都忽略NaN的数据点,在该点出现的地方留下一个洞孔。

例子如下:

 

»[X,Y,Z]=peaks(30;

»x=X(1,:

;%vectorofxaxis

»y=Y(:

1;%vectorofyaxis

»i=find(y>.8&y<1.2;%findx-axisindicesofhole

»j=find(x>-.6&x<.5;%findx-axisindicesofhole

»Z(i,j=nan*Z(i,j;%setvaluesatholeindicestoNaNs

»surf(X,Y,Z

»grid,xlabel(‘x-axis‘,ylabel(‘y-axis‘,zlabel(‘z-axis‘

»title(‘SURFofPEAKSwithaHole‘

输出见图18.13.

图18.13函数PEAKS的带洞孔曲面图

MATLAB的surf也有两个同种函数:

surfc,它画出具有基本等值线的曲面图;surfl,它画出一个有亮度的曲面图。

例如:

»[X,Y,Z]=peaks(30;

»surfc(X,Y,Z%surfplotwithcontourplot

»grid,xlabel(‘x-axis‘,ylabel(‘y-axis‘,zlabel(‘z-axis‘

»title(‘SURFCofPEAKS‘

输出见图18.14.

图18.14函数PEAKS的曲面图和基本等值线图

»[X,Y,Z]=peaks(30;

»surfl(X,Y,Z%surfplotwithlighting

»shadinginterp%surflplotslookbestwithinterpshading

»colormappink%theyalsolookbetterwiths

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2