Download presentation
Presentation is loading. Please wait.
Published byJutta Mäkinen Modified 5年之前
1
第5章 MATLAB绘图 5.1 二维图形 5.2 三维图形 5.3 三维图形的精细处理 5.4 隐函数绘图 5.5 低层绘图操作
5.1 二维图形 5.2 三维图形 5.3 三维图形的精细处理 5.4 隐函数绘图 5.5 低层绘图操作 5.6 光照和材质处理 5.7 图像显示与动画制作
2
Matlab 绘图 手工作图 找点: x=0, pi/4, pi/2, 2*pi/3, pi, …
计算函数值: y=sin(0), sin(pi/4), sin(pi/2), … 描点:在坐标系中画出这些离散点 用直线或曲线连接这些点,得到函数的大致图形
3
Matlab 作图 例:>> x=[0:pi/10:2*pi]; 给出离散点列: x=[0:pi/10:2*pi]
计算函数值: y=sin(x) 画图:用 matlab 二维绘图命令 plot 作出函数图形 plot(x,y) 例:>> x=[0:pi/10:2*pi]; >> y=sin(x); >> plot(x,y);
4
二维图形 绘制二维曲线的基本函数 1. plot函数的基本用法 plot函数的基本调用格式为: plot(x,y): x和y为长度相同的向量,分别用于存储x坐标和y坐标数据。
5
例5. 1 在0≤X≤2区间内,绘制曲线y=2e-0. 5xsin(2πx)。 程序如下: x=0:pi/100:2. pi; y=2
例5.1 在0≤X≤2区间内,绘制曲线y=2e-0.5xsin(2πx)。 程序如下: x=0:pi/100:2*pi; y=2*exp(-0.5*x).*sin(2*pi*x); plot(x,y)
6
例5.2 绘制参数方程曲线。 程序如下: t=-pi:pi/100:pi;x=t.*cos(3*t);y=t.*sin(t).*sin(t); plot(x,y); 说明: (1)当x,y是同维矩阵时,则以x,y对应列元素为横、纵坐标分别绘制曲线,曲线条数等于矩阵的列数。 t=linspace(0,2*pi,100); x=[t;t]';y=[sin(t);cos(t)]'; plot(x,y)
7
说明: (2)当x是向量,y是有一维与x同维的矩阵时,则绘制出多根不同色彩的曲线。曲线条数等于y矩阵的另一维数,x被作为这些曲线共同的横坐标。 t=linspace(0,2*pi,100); y=[sin(t);cos(t)]; plot(x,y) (3)plot函数最简单的调用格式是只包含一个输入参数:plot(x)。当x是实向量时,则以该向量元素的下标为横坐标,元素值为纵坐标画出一条曲线;当x是实矩阵时,则按列绘制每列元素值相对其下标的曲线,曲线条数等于x阵的列数。 t=linspace(0,2*pi,100); plot(t) a=[1 1 1; ; ]; plot(a)
8
2.含多个输入参数的plot函数 含多个输入参数的plot函数调用格式为: plot(x1,y1,x2,y2,…,xn,yn) t=linspace(0,2*pi,100); plot(t, sin(t),t,2*sin(t),t,3*sin(t))%每一对绘制一条曲线 x=linspace(0,2*pi,100 );%按对应列元素为横纵坐标绘制 y1=sin(x);y2=2*sin(x);y3=3*sin(x);x=[x;x;x]'; y=[y1;y2;y3]';plot(x,y,x,cos(x))
9
3.含选项的plot函数 含选项的plot函数调用格式为: plot(x1,y1,选项1,x2,y2, 选项2,…,xn,yn,选项n)
红色、虚线、离散点用加号 >> x=[0:0.2:2*pi]; >> plot(x,cos(x)); >> plot(x,cos(x),'r+:'); >> plot(x,cos(x),'bd-.'); >> plot(x,cos(x),'k*-'); 属性可以全部指定,也 可以只指定其中某几个 排列顺序任意 蓝色、点划线 离散点为菱形 黑色、实线 离散点用星号
10
图形的基本属性 线型 点标记 颜色 - 实线 : 虚线 -. 点划线 -- 间断线 . 点 o 小圆圈 x 叉子符 + 加号 * 星号
- 实线 : 虚线 -. 点划线 -- 间断线 . 点 o 小圆圈 x 叉子符 + 加号 * 星号 s 方格 d 菱形 ^ 朝上三角 v 朝下三角 > 朝右三角 < 朝左三角 p 五角星 h 六角星 y 黄色 m 棕色 c 青色 r 红色 g 绿色 b 蓝色 w 白色 k 黑色 help plot
11
例5.3 用不同线型和颜色在同一坐标内绘制曲线y=2e-0.5xsin(2πx)及其包络线。
程序如下: x=(0:pi/100:2*pi)'; y1=2*exp(-0.5*x)*[1,-1]; y2=2*exp(-0.5*x).*sin(2*pi*x); x1=(0:12)/2; y3=2*exp(-0.5*x1).*sin(2*pi*x1); plot(x,y1,'g:',x,y2,'b--',x1,y3,'rp');
12
4.双纵坐标函数plotyy plotyy函数是MATLAB 5
4.双纵坐标函数plotyy plotyy函数是MATLAB 5.X新增的函数。它能把函数值具有不同量纲、不同数量级的两个函数绘制在同一坐标中。 调用格式为: plotyy(x1,y1,x2,y2) 其中x1-y1对应一条曲线,x2-y2对应另一条曲线。横坐标的标度相同,纵坐标有两个,左纵坐标用于x1-y1数据对,右纵坐标用于x2-y2数据对。
13
例5.4 用不同标度在同一坐标内绘制曲线y1=e-0.5xsin(2πx)及曲线y2=1.5e-0.1xsin(x)。
程序如下: x1=0:pi/100:2*pi; x2=0:pi/100:3*pi; y1=exp(-0.5*x1).*sin(2*pi*x1); y2=1.5*exp(-0.1*x2).*sin(x2); plotyy(x1,y1,x2,y2);
14
5.1.2 绘制图形的辅助操作 1. 图形标注 有关图形标注函数的调用格式为: title(图形名称) xlabel(x轴说明) ylabel(y轴说明) text(x,y,图形说明) legend(图例1,图例2,…)
15
图形的其他属性 标题 title('text') 例:
可以指定文本的属性 title('text', 'Property1', value1, ' Property2', value2, ...) Property: linewidth, markersize, fontsize, fontweight, fontname, …
16
图形的其他属性 例: 例: 坐标轴标注 xlabel(’text’) 或 ylabel(’text’) 添加图例
legend(string1,string2, ...) >> legend('cos(x)'); 例:
17
图形的其他属性 直观方法:可以直接在图象上进行编辑 在指定地方添加文本 text(x,y,string1,string2, ...)
>> text(pi/2,cos(pi/2),'\leftarrowy=cos(x)'); xlable, ylabel, text 命令也可以指定文本的属性 直观方法:可以直接在图象上进行编辑
18
2. 坐标控制 函数的调用格式为: axis([xmin xmax ymin ymax zmin zmax]) axis函数功能丰富,常用的用法还有: axis equal 纵、横坐标轴采用等长刻度 axis square 产生正方形坐标系(缺省为矩形) axis auto 使用缺省设置 axis off 取消坐标轴 axis on 显示坐标轴 grid on/off命令控制是画还是不画网格线,不带参数的grid命令在两种状态之间进行切换。 box on/off命令控制是加还是不加边框线,不带参数的box命令在两种状态之间进行切换。
19
例5.5 绘制分段函数曲线并添加图形标注。 程序如下: x=linspace(0,10,100); y=[]; for x0=x
例5.5 绘制分段函数曲线并添加图形标注。 程序如下: x=linspace(0,10,100); y=[]; for x0=x if x0>=8 y=[y,1]; elseif x0>=6 y=[y,5-x0/2]; elseif x0>=4 y=[y,2]; elseif x0>=0 y=[y,sqrt(x0)]; end plot(x,y) axis([ ]) %设置坐标轴 title('分段函数曲线'); %加图形标题 xlabel('Variable X'); %加X轴说明 ylabel('Variable Y'); %加Y轴说明 text(2,1.3,'y=x^{1/2}'); %在指定位置添加图形说明 text(4.5,1.9,'y=2');text(7.3,1.5,'y=5-x/2');text(8.5,0.9,'y=1');
20
3. 图形保持 一般情况下,绘图命令每执行一次就刷新当前图形窗口,图形窗口原有图形将不复存在。若希望在已存在的图形上再继续添加新的图形,可使用图形保持命令hold。hold on/off命令控制是保持原有图形还是刷新原有图形,不带参数的hold命令在两种状态之间进行切换。
21
例5.6 用图形保持功能在同一坐标内绘制 及其包络线。
程序如下: x=(0:pi/100:2*pi)'; y1=2*exp(-0.5*x)*[1,-1]; y2=2*exp(-0.5*x).*sin(2*pi*x); plot(x,y1,'b:'); axis([0,2*pi,-2,2]); %设置坐标 hold on; %设置图形保持状态 plot(x,y2,'k'); legend('包络线','包络线','曲线y'); %加图例 hold off; %关闭图形保持 grid %网格线控制
22
4. 图形窗口的分割 subplot函数的调用格式为: subplot(m,n,p)
例5.7 在一个图形窗口中以子图形式同时绘制正弦、余弦、正切、余切曲线。 程序如下: x=linspace(0,2*pi,60); y=sin(x);z=cos(x); t=sin(x)./(cos(x)+eps); ct=cos(x)./(sin(x)+eps); subplot(2,2,1); plot(x,y);title('sin(x)');axis ([0,2*pi,-1,1]); subplot(2,2,2); plot(x,z);title('cos(x)');axis ([0,2*pi,–1,1]); subplot(2,2,3); plot(x,t);title('tangent(x)');axis ([0,2*pi,-40,40]); subplot(2,2,4); plot(x,ct);title('cotangent(x)');axis ([0,2*pi,-40,40]);
23
对图形窗口灵活分割。 请看下面的程序。 x=linspace(0,2*pi,60); y=sin(x);z=cos(x);
t=sin(x)./(cos(x)+eps); ct=cos(x)./(sin(x)+eps); subplot(2,2,1); %选择2×2个区中的1号区 stairs(x,y);title('sin(x)-1');axis ([0,2*pi,-1,1]); subplot(2,1,2); %选择2×1个区中的2号区 stem(x,y);title('sin(x)-2');axis ([0,2*pi,-1,1]); subplot(4,4,3); %选择4×4个区中的3号区 plot(x,y);title('sin(x)');axis ([0,2*pi,-1,1]); subplot(4,4,4); %选择4×4个区中的4号区 plot(x,z);title('cos(x)');axis ([0,2*pi,-1,1]); subplot(4,4,7); %选择4×4个区中的7号区 plot(x,t);title('tangent(x)');axis ([0,2*pi,-40,40]); subplot(4,4,8); %选择4×4个区中的8号区 plot(x,ct);title('cotangent(x)');axis ([0,2*pi,-40,40]);
24
5.1.3 绘制二维图形的其他函数 1. 其他形式的线性直角坐标图
绘制二维图形的其他函数 1. 其他形式的线性直角坐标图 在线性直角坐标系中,其他形式的图形有条形图、阶梯图、杆图和填充图等,所采用的函数分别是: bar(x,y,选项) stairs(x,y,选项) stem(x,y,选项) fill(x1,y1,选项1,x2,y2,选项2,…)
25
例5.8 分别以条形图、填充图、阶梯图和杆图形式绘制曲线y=2e-0.5x。
程序如下: x=0:0.35:7; y=2*exp(-0.5*x); subplot(2,2,1);bar(x,y,'g'); title('bar(x,y,''g'')');axis([0,7,0,2]); subplot(2,2,2);fill(x,y,'r'); title('fill(x,y,''r'')');axis([0,7,0,2]); subplot(2,2,3);stairs(x,y,'b'); title('stairs(x,y,''b'')');axis([0,7,0,2]); subplot(2,2,4);stem(x,y,'k'); title('stem(x,y,''k'')');axis([0,7,0,2]);
26
2.极坐标图 polar函数用来绘制极坐标图,其调用格式为: polar(theta,rho,选项) 其中theta为极坐标极角,rho为极坐标矢径,选项的内容与plot函数相似。
例5.9 绘制ρ=sin(2θ)cos(2θ)的极坐标图。 程序如下: theta=0:0.01:2*pi; rho=sin(2*theta).*cos(2*theta); polar(theta,rho,'k');
27
3.对数坐标图形 MATLAB提供了绘制对数和半对数坐标曲线的函数,调用格式为: semilogx(x1,y1,选项1,x2,y2,选项2,…) semilogy(x1,y1,选项1,x2,y2,选项2,…) loglog(x1,y1,选项1,x2,y2,选项2,…)
28
例5. 10 绘制y=10x2的对数坐标图并与直角线性坐标图进行比较。 程序如下: x=0:0. 1:10; y=10. x
例5.10 绘制y=10x2的对数坐标图并与直角线性坐标图进行比较。 程序如下: x=0:0.1:10; y=10*x.*x; subplot(2,2,1);plot(x,y);title('plot(x,y)');grid on; subplot(2,2,2);semilogx(x,y);title('semilogx(x,y)'); grid on; subplot(2,2,3);semilogy(x,y);title('semilogy(x,y)'); subplot(2,2,4);loglog(x,y);title('loglog(x,y)');grid on;
29
4. 对函数自适应采样的绘图函数 fplot函数的调用格式为: fplot(fname,lims,tol,选项) 例5
4. 对函数自适应采样的绘图函数 fplot函数的调用格式为: fplot(fname,lims,tol,选项) 例5.11 用fplot函数绘制f(x)=cos(tan(πx))的曲线。 先建立函数文件myf.m: function y=myf(x) y=cos(tan(pi*x)); 再用fplot函数绘制myf.m函数的曲线: fplot('myf',[-0.4,1.4],1e-4)
30
MATLAB提供的绘图函数还有很多,例如,用来表示各元素占总和的百分比的饼图、复数的相量图等等。
5. 其他形式的图形 MATLAB提供的绘图函数还有很多,例如,用来表示各元素占总和的百分比的饼图、复数的相量图等等。 例5.12 绘制图形: (1)某次考试优秀、良好、中等、及格、不及格的人数分别为:7,17,23,19,5,试用饼图作成绩统计分析。 (2)绘制复数的相量图:3+2i、4.5-i和-1.5+5i。 程序如下: subplot(1,2,1); pie([7,17,23,19,5]); title('饼图');legend('优秀','良好','中等','及格','不及格'); subplot(1,2,2); compass([3+2i,4.5-i,-1.5+5i]);title('相量图');
31
空间三维作图 三维曲线 : plot3 plot3(x,y,z,s) 例:三维螺旋线 三维曲线只能 用参数方程绘制
设三维曲线的参数方程为:x=x(t),y=y(t),z=z(t), 则其图形可由下面的命令绘出: 三维曲线只能 用参数方程绘制 plot3(x,y,z,s) 例:三维螺旋线 >> t=[0:0.1:10*pi]; >> x=2*t; >> y=sin(t); z=cos(t); >> plot3(x,y,z); plot3 的用法与 plot 类似
32
空间三维作图 空间曲面
33
空间三维作图 空间曲面 mesh(X,Y,Z) 绘制由矩阵 X,Y,Z 所确定的曲面网格图 mesh(x,y,Z)
x, y 是向量,length(x)=n,length(y)=m,[m,n]=size(Z) mesh(Z) :绘出矩阵 Z 的三维消隐图。
34
二维作图举例 点 线 先画点,后连线 例:y = sin(x), 0 < x < 2 二、连线
>> x=[0:0.5:2*pi]; >> y=sin(x); >> plot(x,y,'r.-')
35
二维作图举例 >> x=[0:0.1:2*pi]; >> y=sin(x);
>> plot(x,y,'.') 加密:取更多的点 >> x=[0:0.1:2*pi]; >> y=sin(x); >> plot(x,y) >> x=[0:0.1:2*pi]; >> y=sin(x); >> plot(x,y,'.-')
36
例:三维螺线 Matlab 空间曲线绘图举例 x=t, y=sin(t), z=cos(t), 0<t<20 先画点,后连线
1) 给出空间离散点的坐标 (x,y,z) 2) 将这些点按顺序连接即可
37
空间曲线作图举例 >> t=[0:0.5:20]; >> x=t; >> y=sin(t);
>> z=cos(t); >> plot3(x,y,z,’.’) >> t=[0:0.5:20]; >> x=t; >> y=sin(t); >> z=cos(t); >> plot3(x,y,z,’.-’)
38
空间曲线作图举例 >> t=[0:0.1:20]; >> x=t; >> y=sin(t);
>> z=cos(t); >> plot3(x,y,z,’.-’) >> t=[0:0.1:20]; >> x=t; >> y=sin(t); >> z=cos(t); >> plot3(x,y,z)
39
5.2 三维图形 例5.13 绘制空间曲线。 程序如下: t=0:pi/50:2*pi; x=8*cos(t);
5.2 三维图形 例5.13 绘制空间曲线。 程序如下: 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'); title('Line in 3-D Space');text(0,0,0,'origin'); xlabel('X'),ylabel('Y'),zlabel('Z');grid;
40
5.2.2 三维曲面 1.平面网格坐标矩阵的生成 (1)利用矩阵运算生成。 x=a:dx:b; y=(c:dy:d)'; X=ones(size(y))*x; Y=y*ones(size(x)); (2)利用meshgrid函数生成。 x=a:dx:b; y=c:dy:d; [X,Y]=meshgrid(x,y);
41
例5.14 已知6<x<30,15<y<36,求不定方程2x+5y=126的整数解。 程序如下:
[x,y]=meshgrid(x,y); %在[5,29]×[14,35]区域生成网格坐标 z=2*x+5*y; k=find(z==126); %找出解的位置 x(k),y(k) %输出对应位置的x,y即方程的解
42
2. 绘制三维曲面的函数 surf函数和mesh函数的调用格式为: mesh(x,y,z,c) surf(x,y,z,c) c省略时,默认c=z,即颜色的设定正比于图形的高度
43
空间曲面作图 先画点 (x,y,z),后连线,构成曲面网格图 点: 线: 分别沿 x 方向和 y 方向 连接这些点即可得到
44
空间曲面作图举例 例:“墨西哥帽子” ( –a < x < a, -a < y <a )
45
空间曲面作图举例 a=8 时的曲面图形 +eps? [X,Y]=meshgrid([-8:0.5:8]);
>> [X,Y]=meshgrid(x,y); >> r=sqrt(X.^2+Y.^2)+eps; >> Z=sin(r)./r; >> mesh(X,Y,Z) +eps? 1) x 与 y 可以取不同的步长 2) 注意这里采用的数组运算 最后一个命令能否改为 mesh(Z)?
46
空间曲面作图举例 例:绘制等高线 meshc >> [X,Y]=meshgrid(-8:0.5:8);
>> r=sqrt(X.^2+Y.^2)+eps; >> Z=sin(r)./r; >> meshc(X,Y,Z)
47
空间曲面作图举例 例:绘制边界面屏蔽 meshz >> [X,Y]=meshgrid(-8:0.5:8);
>> r=sqrt(X.^2+Y.^2)+eps; >> Z=sin(r)./r; >> meshz(X,Y,Z)
48
surf 作图举例 >> [X,Y]=meshgrid(-8:0.5:8);
>> r=sqrt(X.^2+Y.^2)+eps; >> Z=sin(r)./r; >> surf(X,Y,Z)
49
mesh 与 surf 的比较
50
例5.15 用三维曲面图表现函数z=sin(y)cos(x)。
程序1: x=0:0.1:2*pi;[x,y]=meshgrid(x);z=sin(y).*cos(x); mesh(x,y,z);xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');title('mesh'); 程序2: surf(x,y,z);xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');title('surf'); 程序3: plot3(x,y,z);xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');title('plot3-1');grid;
51
例5.16 绘制两个直径相等的圆管的相交图形。 程序如下: %两个等直径圆管的交线 m=30; z=1.2*(0:m)/m;
例5.16 绘制两个直径相等的圆管的相交图形。 程序如下: %两个等直径圆管的交线 m=30; z=1.2*(0:m)/m; r=ones(size(z)); theta=(0:m)/m*2*pi; x1=r'*cos(theta);y1=r'*sin(theta); %生成第一个圆管的坐标矩阵 z1=z'*ones(1,m+1); x=(-m:2:m)/m; x2=x'*ones(1,m+1);y2=r'*cos(theta); %生成第二个圆管的坐标矩阵 z2=r'*sin(theta); surf(x1,y1,z1); %绘制竖立的圆管 axis equal,axis off hold on surf(x2,y2,z2); %绘制平放的圆管 title('两个等直径圆管的交线'); hold off
52
例5.17 分析由函数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;mesh(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子图的坐标设置
53
例5.18 在xy平面内选择区域[-8,8]×[-8,8],绘制函数的4种三维曲面图。
程序如下: [x,y]=meshgrid(-8:0.5:8); z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2+eps); subplot(2,2,1); meshc(x,y,z); title('meshc(x,y,z)') subplot(2,2,2); meshz(x,y,z); title('meshz(x,y,z)') subplot(2,2,3); surfc(x,y,z) title('surfc(x,y,z)') subplot(2,2,4); surfl(x,y,z) title('surfl(x,y,z)')
54
[x,y,z]=sphere(n), n决定了球面的圆滑程度 cylinder函数的调用格式为:
3. 标准三维曲面 sphere函数的调用格式为: [x,y,z]=sphere(n), n决定了球面的圆滑程度 cylinder函数的调用格式为: [x,y,z]= cylinder(R,n),R向量,各个等间隔高度上的半径 MATLAB还有一个peaks 函数,称为多峰函数,常用于三维曲面的演示。 sphere 只能画单位球面!
55
sphere 作图 如果没有给出 n 的值, 则系统默认为 n=20
56
例5. 19 绘制标准三维曲面图形。 程序如下: t=0:pi/20:2
例5.19 绘制标准三维曲面图形。 程序如下: t=0:pi/20:2*pi; [x,y,z]= cylinder(2+sin(t),30); subplot(1,3,1); surf(x,y,z); subplot(1,3,2); [x,y,z]=sphere; subplot(1,3,3); [x,y,z]=peaks(30); meshz(x,y,z);
57
5.2.3 其他三维图形 条形图、饼图和填充图等特殊图形,它们还可以以三维形式出现,使用的函数分别是bar3、pie3和fill3。此外,还有三维曲面的等高线图。等高线图分二维和三维两种形式,分别使用函数contour和contour3绘制。
58
例5.20 绘制三维图形: (1)绘制魔方阵的三维条形图。 (2)以三维杆图形式绘制曲线y=2sin(x)。 (3)已知x=[2347,1827,2043,3025],绘制三维饼图。 (4)用随机的顶点坐标值画出五个黄色三角形。 程序如下: subplot(2,2,1); bar3(magic(4)) subplot(2,2,2); y=2*sin(0:pi/10:2*pi); stem3(y); subplot(2,2,3); pie3([2347,1827,2043,3025]); subplot(2,2,4); fill3(rand(3,5),rand(3,5),rand(3,5), 'y' )
59
例5.21 绘制多峰函数的瀑布图和等高线图。 程序如下: subplot(1,2,1); [X,Y,Z]=peaks(30); waterfall(X,Y,Z) xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis'); subplot(1,2,2); contour3(X,Y,Z,12,'k'); %其中12代表高度的等级数
60
5.3.1 视点处理 MATLAB提供了设置视点的函数view。其调用格式为: view(az,el)
三维图形的精细处理 5.3.1 视点处理 MATLAB提供了设置视点的函数view。其调用格式为: view(az,el) 其中az为方位角,el为仰角,它们均以度为单位。系统缺省的视点定义为方位角-37.5°,仰角30°。
61
subplot(2,2,1);mesh(peaks);
例5.22 从不同视点绘制多峰函数曲面。 程序如下: subplot(2,2,1);mesh(peaks); view(-37.5,30); %指定子图1的视点 title('azimuth=-37.5,elevation=30') subplot(2,2,2);mesh(peaks); view(0,90); %指定子图2的视点 title('azimuth=0,elevation=90') subplot(2,2,3);mesh(peaks); view(90,0); %指定子图3的视点 title('azimuth=90,elevation=0') subplot(2,2,4);mesh(peaks); view(-7,-10); %指定子图4的视点 title('azimuth=-7,elevation=-10')
62
5.3.2 色彩处理 1. 颜色的向量表示 MATLAB除用字符表示颜色外,还可以用含有3个元素的向量表示颜色。 2. 色图
色彩处理 1. 颜色的向量表示 MATLAB除用字符表示颜色外,还可以用含有3个元素的向量表示颜色。 2. 色图 色图是m×3 的数值矩阵,它的每一行是RGB三元组。色图矩阵可以人为地生成,也可以调用MATLAB提供的函数来定义色图矩阵。 除plot及其派生函数外,mesh、surf等函数均使用色图着色。图形窗口色图的设置和改变,使用函数: colormap(m) 其中m代表色图矩阵。 colormap([r g b]), r, g, b 都是 0 ~ 1 之间的一个数,见表5.3
63
色彩处理 3. 三维表面图形的着色 三维表面图实际上就是在网格图的每一个网格片上涂上颜色。surf函数用缺省的着色方式对网格片着色。除此之外,还可以用shading命令来改变着色方式。
64
例5.23 3种图形着色方式的效果展示。 程序如下: z=peaks(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;
65
5.3.3 图形的裁剪处理 MATLAB定义的NaN常数可以用于表示那些不可使用的数据,利用这种特性,可以将图形中需要裁剪部分对应的函数值设置成NaN,这样在绘制图形时,函数值为NaN的部分将不显示出来,从而达到对图形进行裁剪的目的。
66
图形的裁剪处理 例如,要削掉正弦波顶部或底部大于0.5的部分,可使用下面的程序: x=0:pi/10:4*pi; y=sin(x); i=find(abs(y)>0.5); x(i)=NaN; plot(x,y);
67
例5.24 绘制两个球面,其中一个球在另一个球里面 将外面的球裁掉一部分,使得能看见里面的球。
例 绘制两个球面,其中一个球在另一个球里面 将外面的球裁掉一部分,使得能看见里面的球。 程序如下: [x,y,z]=sphere(20); %生成外面的大球 z1=z; z1(:,1:4)=NaN; %将大球裁掉一部分 c1=ones(size(z1)); surf(3*x,3*y,3*z1,c1); %生成里面的小球 hold on z2=z; c2=2*ones(size(z2)); c2(:,1:4)=3*ones(size(c2(:,1:4))); surf(1.5*x,1.5*y,1.5*z2,c2); colormap([0,1,0;0.5,0,0;1,0,0]); grid on hold off
68
5.4 隐函数绘图 MATLAB提供了一个ezplot函数绘制隐函数图形,下面介绍其用法。 (1) 对于函数f = f(x),ezplot函数的调用格式为: ezplot(f):在默认区间-2π<x<2π绘制f = f(x)的图形。 ezplot(f, [a,b]):在区间a<x<b绘制f = f(x)的图形。
69
(2) 对于隐函数f = f(x,y),ezplot函数的调用格式为: ezplot(f):在默认区间-2π<x<2π和-2π<y<2π绘制f(x,y) = 0的图形。 ezplot(f, [xmin,xmax,ymin,ymax]):在区间xmin<x<xmax和ymin<y<ymax绘制f(x,y) = 0的图形。 ezplot(f, [a,b]):在区间a<x<b和a<y< b绘制f(x,y) = 0的图形。
70
(3) 对于参数方程x = x(t)和y = y(t),ezplot函数的调用格式为: ezplot(x,y):在默认区间0<t<2π绘制x=x(t)和y=y(t)的图形。 ezplot(x,y, [tmin,tmax]):在区间tmin < t < tmax绘制x=x(t)和y=y(t)的图形。
71
例5.25 隐函数绘图应用举例。 程序如下: subplot(2,2,1); ezplot('x^2+y^2-9');axis equal subplot(2,2,2); ezplot('x^3+y^3-5*x*y+1/5') subplot(2,2,3); ezplot('cos(tan(pi*x))',[ 0,1]) subplot(2,2,4); ezplot('8*cos(t)','4*sqrt(2)*sin(t)',[0,2*pi])
72
5.5 低层绘图操作 5.5.1 图形对象及其句柄 1. 图形对象 MATLAB把构成图形的各个基本要素称为图形对象。这些对象包括计算机屏幕、图形窗口(Figure)、坐标轴(Axes)、用户菜单(Uimenu)、用户控件(Uicontrol)、曲线(Line)、曲面(Surface)、文字(Text)、图像(image)、光源(Light)、区域块(Patch)和方框(Rectangle)。系统将每一个对象按树型结构组织起来。每个图形对象都可以被独立地操作。
73
2. 图形对象句柄 MATLAB在创建每一个图形对象时,都为该对象分配唯一的一个值,称其为图形对象句柄(Handle)。句柄是图形对象的唯一标识符。 MATLAB提供了3个用于获取已有图形对象句柄的函数: gcf 获取当前图形窗口的句柄(get current figure)。 gca 获取当前坐标轴的句柄(get current axis)。 gco 获取最近被单击的图形对象的句柄(get current object)。
74
5.5.2 图形对象属性 1. 属性名与属性值 MATLAB给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值成为属性值。例如,LineStyle是曲线对象的一个属性名,它的值决定着线型,取值可以是'-' 、':'、'-.'、'--'或'none'。
75
set(句柄,属性名1,属性值1,属性名2,属性值2,…) get函数的调用格式为:
图形对象属性 2. 属性的操作 set函数的调用格式为: set(句柄,属性名1,属性值1,属性名2,属性值2,…) get函数的调用格式为: V=get(句柄,属性名)
76
3. 对象的公共属性 图形对象具有各种各样的属性,有些属性是所有对象共同具备的,有些则是各对象所特有的。
例5.26 在同一坐标下画红、绿两根不同曲线,希望获得绿色曲线的句柄,并对其进行设置。 程序如下: x=0:pi/50:2*pi; y=sin(x); z=cos(x); plot(x,y,'r',x,z,'g'); H=get(gca,'Children'); %获取两曲线句柄向量H for k=1:length(H) if get(H(k),'Color')==[0 1 0] %[0 1 0]代表绿色 Hg=H(k); %获取绿色线条句柄 end pause %便于观察设置效果 set(Hg,'LineStyle',':','Marker','p'); %对绿色曲线进行设置
77
5.5.3 图形对象的创建 1. 图形窗口对象 建立图形窗口对象使用figure函数。调用该函数的命令形式为: 句柄变量=figure(属性名1,属性值1,属性名2,属性值2,…) MATLAB为每个图形窗口提供了很多属性。这些属性及其取值控制着图形窗口对象。除公共属性外,其他常用属性:MenuBar属性、Name属性、Position属性、Color属性等。
78
例5.27 建立一个图形窗口。该图形窗口没有菜单条,标题名称为“图形窗口示例”,起始于屏幕左下角、宽度和高度分别为300像素点和150像素点,背景颜色为绿色,且当用户从键盘按下任意一个键时,将显示“Hello,Keyboard Key Pressed.”字样。 命令如下: hf=figure('Color',[0,1,0],'Position',[1,1,300,150],... 'Name','图形窗口示例','NumberTitle','off','MenuBar','none',... 'KeyPressFcn','disp(''Hello,Keyboard Key Pressed.'')');
79
例5.28 分别在4个不同的图形窗口绘制出正弦、余弦、正切、余切曲线。要求先建立一个图形窗口并绘图,然后每关闭一个再建立下一个,直到建立第4个窗口并绘图。
程序如下: x=linspace(0,2*pi,60); y=sin(x);z=cos(x);t=tan(x);ct=1./(t+eps);; %命令组待用 C4=['figure(''Name'',''cotangent(x)'',''NumberTitle'',',... '''off'');plot(x,ct);axis([0,2*pi,-40,40]);']; C3=['figure(''Name'',''tangent(x)'',''DeleteFcn'',C4,',... '''NumberTitle'',''off'');plot(x,t);axis([0,2*pi,-40,40]);']; C2=['figure(''Name'',''cos(x)'',''DeleteFcn'',C3,',... '''NumberTitle'',''off'');plot(x,z);axis([0,2*pi,-1,1]);']; %先创建1个图形窗口并绘制曲线 figure('Name','sin(x)','DeleteFcn',C2,'NumberTitle','off'); plot(x,y);axis([0,2*pi,-1,1]);
80
建立坐标轴对象使用axes函数,调用它的命令形式为:
2. 坐标轴对象 建立坐标轴对象使用axes函数,调用它的命令形式为: 句柄变量=axes(属性名1,属性值1,属性名2,属性值2,…) MATLAB为每个坐标轴对象提供了很多属性。除公共属性外,还有其他常用属性。
81
例5. 29 利用坐标轴对象实现图形窗口的任意分割。 程序如下: clf; %清图形窗口 x=linspace(0,2
例5.29 利用坐标轴对象实现图形窗口的任意分割。 程序如下: clf; %清图形窗口 x=linspace(0,2*pi,20);y=sin(x); axes('Posi',[0.2,0.2,0.2,0.7]);plot(y,x);title('sin(x)-1‘); axes(’Posi‘,[0.4,0.5,0.2,0.1]);stairs(x,y);title(’sin(x)-2‘); axes(’Posi‘,[0.55,0.6,0.25,0.3]);stem(x,y);title(’sin(x)-3‘); axes(’Posi‘,[0.55,0.2,0.25,0.3]);stem(x,y);title(’sin(x)-4‘);
82
3. 曲线对象 建立曲线对象使用line函数,调用它的命令形式为:
句柄变量=line(x,y,z,属性名1,属性值1,属性名2,属性值2,…) 其中对x,y,z的解释与高层曲线函数plot和plot3等一样,其余的解释与前面介绍过的figure和axes函数类似。 每个曲线对象也具有很多属性。除公共属性外,还有其他常用属性。 例5.30 利用曲线对象绘制曲线。 程序如下: t=0:pi/100:pi/2; y1=sin(2*pi*t); y2=sqrt(3)/2*exp(-4*t).*sin(4*sqrt(3)*t+pi/3); figh=figure; axes('GridLineStyle',':','XLim',[0,pi/2],'YLim',[-1,1]); line('XData',t,'YData',y1,'LineWidth',1); line(t,y2); grid on
83
4. 文字对象 使用text函数可以根据指定位置和属性值添加文字说明,并保存句柄。调用该函数的命令形式为: 句柄变量=text(x,y,z,‘说明文字’,属性名1,属性值1,属性名2,属性值2,…) 其中说明文字中除使用标准的ASCII字符外,还可使用LATEX格式的控制字符。 除公共属性外,文字对象还有其他常用属性。
84
例5. 31 利用曲线对象绘制曲线和并利用文字对象完成标注。 程序如下: theta=-pi:
例5.31 利用曲线对象绘制曲线和并利用文字对象完成标注。 程序如下: theta=-pi:.1:pi; y1=sin(theta); y2=cos(theta); h=line(theta,y1,'LineStyle',':','Color','g'); line(theta,y2,'LineStyle','--','Color','b'); xlabel('-\pi \leq \theta \leq \pi') ylabel('sin(\theta)') title('Plot of sin(\theta)') text(-pi/4,sin(-pi/4),'\leftarrow sin(-\pi\div4)','FontSize',12) set(h,'Color','r','LineWidth',2) %改变曲线1的颜色和线宽
85
建立曲面对象使用surface函数,调用它的命令形式为: 句柄变量=surface(x,y,z,属性名1,属性值1,属性名2,属性值2,…)
5. 曲面对象 建立曲面对象使用surface函数,调用它的命令形式为: 句柄变量=surface(x,y,z,属性名1,属性值1,属性名2,属性值2,…) 其中对x,y,z的解释与高层曲面函数mesh和surf等一样,其余的解释与前面介绍过的figure和axes等函数类似。 每个曲面对象也具有很多属性。除公共属性外,还有其他常用属性。
86
例5.32 利用曲面对象绘制三维曲面z=sin(y)cos(x)。 程序如下:
x=0:0.1:2*pi;[x,y]=meshgrid(x);z=sin(y).*cos(x); axes('view',[-37.5,30]); hs=surface(x,y,z,'FaceColor','w','EdgeColor','flat'); grid on; xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis'); title('mesh-surf'); pause; set(hs,'FaceColor','flat');
87
6.区域块对象 区域块对象是指一个任意多边形区域。在MATLAB中,可以使用patch函数创建一个或多个多边形。有两种形式的patch函数,一种是高级语法形式,另一种是低级语法形式。前者通过指定每个小面的顶点坐标和颜色来创建区域块对象,后者通过指定所有顶点的坐标和各小面的顶点和颜色来创建。 使用高级语法形式时,patch函数的调用格式为: patch(x,y,z,c) 该函数在当前坐标轴中创建二维(x,y)或三维(x,y,z)空间中带填充模式的区域块对象。x,y,z确定顶点坐标。如果x,y,z为矩阵,则MATLAB按列创建多个多边形。c指定每一区域块对象的颜色,它既可以用字符表示,也可以用RGB三元组表示。 例5.33 绘制两个等直径圆柱体的交线。
88
%PLINE 绘制给定点和属性直线 % pline(P,w,c,s)绘制两点间直线 % P为矩阵 w是宽度,c颜色s 线 function pline(P,w,c,s) [m,n]=size(P); if m==2 %二维曲线 H1=plot(P(1,:),P(2,:)); set(H1,'linewidth',w,'color',c,'linestyle',s) elseif m==3 %三维 H2=plot3(P(1,:),P(2,:),P(3,:)); else error('输入错误') end
89
r1=5; r2=5; %第一个圆柱半径 P0=[0;0];P1=[-5;5];P2=[-13;5];P3=[-13;-5];P4=[13;-5];P5=[13;5];P6=[5;5]; patch([P0(1),P6(1),P5(1),P4(1),P3(1),P2(1),P1(1)],... [P0(2),P6(2),P5(2),P4(2),P3(2),P2(2),P1(2)],'y') axis([ ]),axis equal,axis off hold on %开始绘制 P7=[5;15];P8=[-5;15]; [P0(2),P6(2),P5(2),P4(2),P3(2),P2(2),P1(2)],'g') pline([P0 P1 P2 P3 P4 P5 P6 P0],2.5,'k','-') pline([P6 P7 P8 P1],2.5,'k','-') %侧视图 t=0:pi/90:2*pi;xc=23+r1*cos(t);zc=r1*sin(t); patch(xc,zc,'y') %垂直圆柱 z1=0; P11=[28;z1];P12=[28;15];P13=[18;15];P14=[18;z1]; ti=0:pi/90:pi; xi2=23+r1*cos(ti);zi2=r1*sin(ti); patch([xi2,P11(1),P12(1),P13(1),P14(1)],... [zi2,P11(2),P12(2),P13(2),P14(2)],'g') pline([xc;zc],2.5,'k','-') pline([P11 P12 P13 P14],2,'k','-') ha=plot([0 0],[-6 16],'k-.'); set(ha,'linewidth',1.5) ht=title('两个等圆柱体的交线'); set(ht,'fontsize',14); t1='水平圆柱: x^2+z^2=r^2'; ht=text(-12,-10,t1); t2='垂直圆柱: x^2+y^2=r^2'; ht=text(-12,-15,t2); ht=text(-12,-20,'交线:z^2-x^2=0'); hold off
90
7.方框对象 在MATLAB中,矩形、圆角矩形、椭圆、圆及对应的区域图形都用方框对象表示。使用rectangle函数可以创建方框对象,其调用格式为: 句柄变量= rectangle (属性名1,属性值1,属性名2,属性值2,…)
91
例5.34 在同一个图形窗口中创建矩形、圆角矩形、椭圆和圆各一个,并使用了不同的线型和线宽。 subplot(2,2,1); rectangle('Position',[2,3,25,15],'LineWidth',3); subplot(2,2,2); rectangle('Position',[3,5,15,8], 'Curvature',0.4,'LineWidth',2); subplot(2,2,3); rectangle('Position',[5,3,10,15],'Curvature',[1,1]); subplot(2,2,4); rectangle('Position',[5,3,10,10],'Curvature',[1,1],... 'LineStyle','--','FaceColor','r'); axis equal
92
5.6 光照和材质处理 5.6.1 光照处理 为了创建光照效果,MATLAB提供了光源(Light)图形对象。用light函数创建Light对象,该函数的调用格式为: light('Color',选项1,'Style',选项2,'Position',选项3) 利用lighting命令可以设置光照模式,其格式为: lighting 选项 其中选项有4种取值:flat、gouraud、phong、none。
93
例5.35 光照处理后的球面并观察不同光照模式下的效果。
例5.35 光照处理后的球面并观察不同光照模式下的效果。 程序如下: [x,y,z]=sphere(20); subplot(1,4,1); surf(x,y,z);axis equal; shading interp; hold on; subplot(1,4,2); light('Position',[0,1,1]); shading interp;lighting flat; plot3(0,1,1,'p');text(0,1,1,' light'); subplot(1,4,3); shading interp;lighting gouraud; subplot(1,4,4); shading interp;lighting phong;
94
5.6.2 材质处理 材质体现了图形对象的反射特性,修改区域块和曲面对象的反射特性,可以改变在场景中应用光照时对象的显示外观。这些特性包括:镜面反射和漫反射、环境光、镜面反射指数、镜面反射光的颜色和背面光照。
95
例5.36 生成一个球体和一个立方体,观察不同光照属性对应的显示效果。
例5.36 生成一个球体和一个立方体,观察不同光照属性对应的显示效果。 程序如下: sphere(36); h=findobj('Type','surface'); set(h,'FaceLighting','phong','FaceColor','interp',... 'EdgeColor',[0.4,0.4,0.4],'BackFaceLighting','lit') hold on vert=[2,0,-1;2,1,-1;3,0,0;3,0,-1;2,0,0;2,1,0;3,1,0;3,0,0]; fac=[1,2,3,4;2,6,7,3;4,3,7,8;1,5,8,4;1,2,6,5;5,6,7,8]; patch('Faces',fac,'Vertices',vert,'FaceColor','y'); light('Position',[1,3,2]); light('Position',[-3,-1,3]); material shiny axis equal hold off
96
5.7 图像显示与动画制作 5.7.1 图像显示 1. imread和imwrite函数 imread和imwrite函数分别用于将图像文件读入MATLAB工作空间,以及将图像数据和色图数据一起写入一定格式的图像文件。 2. image和imagesc函数 这两个函数用于图像显示。为了保证图像的显示效果,一般还应使用colormap函数设置图像色图。
97
例5.37 在E盘根目录下有一图像文件flower.jpg,在图形窗口显示该图像。 程序如下:
[x,cmap]=imread('e:\flower.jpg'); %读取图像的数据阵和色图阵 image(x); %显示图像 colormap(cmap); axis image off %保持宽高比并取消坐标轴
98
动画制作 1.影片动画制作 如果将MATLAB产生的多幅图形保存起来,并利用系统提供的函数进行播放,就可产生动画效果。MATLAB提供了3个函数用于捕捉和播放动画,它们分别为getframe、moviein和movie。 getframe函数可截取每一幅画面信息而形成一个很大的列向量。该向量可保存到一个变量中。显然,保存n幅图就需一个大矩阵。 moviein(n)函数用来建立一个足够大的n列矩阵。该矩阵用来保存n幅画面的数据,以备播放。之所以要事先建立一个大矩阵,是为了提高程序运行速度。 movie(m,n)函数播放由矩阵m所定义的画面n次,默认时播放一次。
99
例5.38 播放一个直径不断变化的球体。 程序如下: [x,y,z]=sphere(50); m=moviein(30); %建立一个30列大矩阵 for i=1:30 surf(i*x,i*y,i*z) %绘制球面 m(:,i)=getframe; %将球面保存到m矩阵 end movie(m,10); %以每秒10幅的速度播放球面
100
2.实时动画制作 制作实时动画的基本方法是,先画出初始图形,再计算活动对象的新位置,并在新位置上把它显示出来,最后擦除原位置上原有的对象,刷新屏幕。重复操作即可产生动画效果。
101
曲線的 EraseMode EraseMode 對於動畫的呈現相當重要,此字串可是下列幾種選擇:
normal:重畫整個畫面。 xor:將舊曲線的點以 xor 的方式還原。 background:將舊曲線的點改成背景顏色。 none:保留舊曲線的點,不做任何處理。 在上述四種 EraseMode 中,耗費時間的次序是 normal > xor > background > none xor 和 background 很接近,但是 background 會抹去其他舊曲線所掃過的其他物件(如圖軸、格線、另一條曲線等),所以較少用到,所以一般在產生動畫時,最常用到的 EraseMode 就是 xor。
102
例5.39 模拟布朗运动。 程序如下: n=30; %指定布朗运动的点数 s=0.02; %指定温度或速率
例5.39 模拟布朗运动。 程序如下: n=30; %指定布朗运动的点数 s=0.02; %指定温度或速率 %产生n个随机点(x,y),处于-0.5到0.5之间 x=rand(n,1)-0.5; y=rand(n,1)-0.5; h=plot(x,y,'.'); %绘制随机点 axis([ ]) ; axis square grid off set(h,'EraseMode','Xor','MarkerSize',20); %设置擦除模式为Xor %循环5000次,产生动画效果 for i=linspace(1,10,5000) drawnow x=x+s*randn(n,1); %在坐标点附近添加随机噪声 y=y+s*randn(n,1); set(h,'XData',x,'YData',y); %通过改变数据属性来重新绘图 end
Similar presentations