1、第9课 MATLAB绘图,9.2 三维图形9.3 三维图形的精细处理9.4 图像与动画,9.2 三维图形,9.2.1绘制三维曲线的最基本函数(P173) plot3函数,与plot函数用法十分相似,其调用格式为:plot3(x1,y1,z1,选项1,x2,y2,z2,选项2, xn,yn,zn,选项n) 其作用是在三维空间中绘制多条曲线。缺省情况下,系统仅以不同颜色对其进行区分。,例9.12 绘制空间曲线。程序如下: t=0:pi/50:2*pi; x=8*cos(t); y=4*sqrt(2)*sin(t); z=-4*sqrt(2)*sin(t); %数据准备 plot3(x,y,z,p)
2、; title(Line in 3-D Space);hold on plot3(0,0,0,.r,markersize,10); text(0,0,0,origin); xlabel(X),ylabel(Y),zlabel(Z); grid;hold off 注:参P173-174例6.3-1,观察: axis equal view(0,0) view(90,0) view(0,45) view(0,-45),9.2.2 三维曲面 1平面网格坐标矩阵的生成 (1)利用矩阵运算生成: x=a:dx:b; y=(c:dy:d); X=ones(size(y)*x; Y=y*ones(size(x
3、); (2)利用meshgrid函数生成(P173): x=a:dx:b; y=c:dy:d; X,Y=meshgrid(x,y);,x=1:6,y=(1:5),X=ones(size(y)*x,Y=y*ones(size(x),解释 meshgrid clf,x=-4:4;y=x;X,Y=meshgrid(x,y); Z=X.2+Y.2; surf(X,Y,Z+15);hold on,colormap(hot) shading flat plot3(X,Y,zeros(9,9),.r); mesh(X,Y,zeros(9,9); stem3(X,Y,Z+15,bo);hold off xla
4、bel(X) ylabel(Y) 注:参P174-175 例6.3-2,例9.13 已知6x30,15y36,求不定方程2x+5y=126的整数解。 程序如下: x=7:29; y=16:35; x,y=meshgrid(x,y);%在7,2916,35区域生成网格坐标 z=2*x+5*y; k=find(z=126); %找出解的位置 x(k),y(k) %输出对应位置的x,y即方程的解 surf(x,y,z);hold on; stem3(x(k),y(k),z(k),bo); hold off;,2. 绘制三维曲面的函数(P174)surf函数和mesh函数的调用格式为: surf(x,
5、y,z,c) mesh(x,y,z,c)x,y为由meshgrid命令生成的自变量二维矩阵,z是根据某一指定的函数关系通过x,y的数组运算生成的因变量二维矩阵,c是指定各点用色的二维矩阵,缺省时c=z。,例9.14 用三维曲面图表现函数z=sin(y)cos(x)。x=0:0.1:2*pi;x,y=meshgrid(x);z=sin(y).*cos(x);figure(1);mesh(x,y,z); title(mesh);xlabel(x-axis),ylabel(y-axis),zlabel(z-axis);figure(2);surf(x,y,z); title(surf);xlabel
6、(x-axis),ylabel(y-axis),zlabel(z-axis); figure(3);plot3(x,y,z); title(plot3-1);xlabel(x-axis),ylabel(y-axis),zlabel(z-axis);,例9.15 分析由函数z=x2-2y2构成的曲面形状及与平面z=a的交线。 程序如下: x,y=meshgrid(-10:0.2:10); z1=(x.2-2*y.2)+eps; %第1个曲面 a=input(a=?); z2=a*ones(size(x); %第2个曲面 subplot(1,2,1); mesh(x,y,z1);hold on;m
7、esh(x,y,z2);%分别画出两个曲面 v=-10,10,-10,10,-100,100;axis(v);grid; %第1子图的坐标设置 hold off;,r0=abs(z1-z2)=1; %求两曲面z坐标差小于1的点 xx=r0.*x; yy=r0.*y; zz=r0.*z2; %求这些点上的x,y,z坐标,即交线坐标 subplot(1,2,2); plot3(xx(r0=0),yy(r0=0),zz(r0=0),*);%在第2子图画出交线 axis(v);grid; %第2子图的坐标设置,3. 标准三维曲面(*) sphere函数的调用格式为:x,y,z=sphere(n)用于在
8、三维空间中画球,x,y,z是sphere生成的用来画球面的坐标值矩阵。(help) cylinder函数的调用格式为:x,y,z= cylinder(R,n)用于在三维空间中画柱状体,R为柱状体截面的曲线函数,x,y,z是用来画柱状体的坐标值矩阵。 MATLAB还有一个peaks 函数,称为多峰函数,常用于三维曲面的演示。(help),9.2.3 其他三维图形(*)条形图、饼图等特殊图形,还可以以三维形式出现,使用的函数分别是bar3、pie3(查help)。此外,还有三维曲面的等高线图。等高线图分二维和三维两种形式,分别使用函数contour和contour3绘制。例9.16 绘制多峰函数的
9、等高线图。(P177 例6.4-1)程序如下: x,y,z=peaks; contour3(x,y,z,12,k); %12代表高度的等级数 xlabel(x-axis),ylabel(y-axis),zlabel(z-axis); title(contour3 of peaks);,9.3 三维图形的精细处理,9.3.1 图形的裁剪处理(P175 镂空)MATLAB定义的NaN常数可以用于表示那些不可使用的数据,利用这种特性,可以将图形中需要裁剪部分对应的函数值设置成NaN,这样在绘制图形时,函数值为NaN的部分将不显示出来,从而达到对图形进行裁剪的目的。,例9.17 裁掉例9.14三维曲面
10、图中z0.25部分。程序如下:x=0:0.02:2*pi;x,y=meshgrid(x);z=sin(y).*cos(x);I,J=find(z0.25);for ii=1:length(I)z(I(ii),J(ii)=NaN;endsurf(x,y,z);,9.3.2 视点处理(P182)MATLAB提供了设置视点的函数view。其调用格式为:view(az,el)其中az为方位角,el为仰角,它们均以度为单位。系统缺省的视点定义为方位角-37.5,仰角30。,例9.18 从不同视点绘制多峰函数曲面。程序如下:subplot(2,2,1);mesh(peaks);view(-37.5,30)
11、; %指定子图1的视点title(方位角=-37.5,仰角=30)subplot(2,2,2);mesh(peaks);view(0,90); %指定子图2的视点title(方位角=0,仰角=90)subplot(2,2,3);mesh(peaks);view(90,0); %指定子图3的视点title(方位角=90,仰角=0)subplot(2,2,4);mesh(peaks);view(-7,-10); %指定子图4的视点title(方位角=-7,仰角=-10),9.3.3 色彩处理(P182-185)1. 颜色的向量表示(* P184 表6.5-2)MATLAB除用字符表示颜色外,还可以
12、用含有3个元素的向量表示颜色。2. 色图 (P183-184 表6.5-3)色图是m3 的数值矩阵,它的每一行是RGB三元组。色图矩阵可以人为地生成,也可以调用MATLAB提供的函数来定义色图矩阵。除plot及其派生函数外,mesh、surf等函数均使用色图着色。图形窗口色图的设置和改变,使用函数:colormap(m)其中m代表色图矩阵。,3. 三维表面图形的着色方式三维表面图实际上就是在网格图的每一个网格片上涂上颜色。surf函数用缺省的着色方式对网格片着色。除此之外,还可以用shading命令来改变着色方式。(P184-185)例9.19 3种图形着色方式的效果展示。程序如下:z=pea
13、ks(20);colormap(copper);subplot(1,3,1);surf(z);subplot(1,3,2); surf(z);shading flat;subplot(1,3,3);surf(z);shading interp;,9.3.4 光照处理 (P186)MATLAB提供了灯光设置的函数,其调用格式为:light(Color,选项1,Style,选项2,Position,选项3)lighting %照明模式,例9.20 光照处理后的多峰函数曲面。程序如下: z=peaks(20); colordef white; clf %P182-183 subplot(1,2,1)
14、;surf(z);light(Posi,0,20,10); shading interp;hold on;plot3(0,20,10,p);text(0,20,10, light); subplot(1,2,2);surf(z);light(Posi,20,0,10 ,Color,r);shading interp; lighting gouraud;hold on;plot3(20,0,10,o);text(20,0,10, light); hold off,9.4 图像与动画,9.4.1 图像(P188-190)1. imread和imwrite函数imread和imwrite函数分别用于
15、将图像文件读入MATLAB工作空间,以及将图像数据和色图数据一起写入一定格式的图像文件。2. image和imagesc函数这两个函数用于图像显示。为了保证图像的显示效果,一般还应使用colormap函数设置图像色图。,例9.21 在当前目录下有一图像文件t1.bmp,在图形窗口显示该图像。程序如下:x,cmap=imread(t1.bmp);%读取图像的数据阵和色图阵image(x);colormap(cmap);axis image off %保持宽高比并取消坐标轴,9.4.2 动画一、彗星状轨迹图 例9.22.用comet函数实现曲线的动态绘制(P180)shg; % Show grap
16、h window. n=10;t=n*pi*(0:0.0005:1); x=sin(t);y=cos(t); axis square; comet(x,y,0.05);注意:查帮助学习comet的使用,二、影片动画( P181)1. getframe函数getframe函数可截取每一幅画面信息而形成一个很大的列向量。该向量可保存到一个变量中。显然,保存n幅图就需一个大矩阵。2. moviein函数moviein(n)函数用来建立一个足够大的n列矩阵。该矩阵用来保存n幅画面的数据,以备播放。3. movie函数 movie(m,n)函数以每秒n幅图形的速度播放由矩阵m的列向量所组成的画面。,例9
17、.23 播放一个直径不断变化的球体。程序如下x,y,z=sphere(50);m=moviein(30); %建立一个30列大矩阵for i=1:30surf(i*x,i*y,i*z) %绘制球面m(:,i)=getframe; %将球面保存到m矩阵endmovie(m,10); %以每秒10幅的速度播放球面 (参 P181 例6.4-5),问题1:用comet函数设计一个简单的动画图形,使小球沿正弦线运动;,1、绘制三维曲线的基本函数(P173) plot3(x1,y1,z1,选项1,x2,y2,z2,选项2, xn,yn,zn,选项n) 2、三维曲面(1)平面网格坐标矩阵的生成:meshgrid函数 (P173)(2) 绘制三维曲面的函数(P174)surf(x,y,z,c) mesh(x,y,z,c),3、 三维图形的精细处理(1) 图形的裁剪(P175 镂空)NaN常数(2) 视点处理(P182)view(az,el)(3) 色彩处理(P182-185)色图 (P183-184 表6.5-3)colormap(m)(4) 三维表面着色方式shading命令 (P184-185),4、图像与动画(1) 图像(P188-190)imread、imwrite、image函数(2) 动画comet函数(P180彗星状轨迹图),