数学软件 第9讲 MATLAB绘图二 主讲教师: 鲜大权 副教授 西南科技大学理学院数学系
9.1 三维图形的精细处理 9.2 图像与动画 9.3 低层绘图操作
西南科技大学网络教育系列课程 数学软件 9.1 三维图形的精细处理 9.1.1 图形的裁剪处理 MATLAB定义的NaN常数可以用于表示那些不可使用的数据,利用这种特性,可以将图形中需要裁剪部分对应的函数值设置成NaN,这样在绘制图形时,函数值为NaN的部分将不显示出来,从而达到对图形进行裁剪的目的。
例9.1 裁掉例8.15三维曲面图中z>0.25部分。 程序如下: x=0:0.1:2*pi;[x,y]=meshgrid(x);z=sin(y).*cos(x); [I,J]=find(z>0.25); for ii=1:length(I) z(I(ii),J(ii))=NaN; end surf(x,y,z);
9.1.2 视点处理 MATLAB提供了设置视点的函数view。其调用格式为: view(az,el) 其中az为方位角,el为仰角,它们均以度为单位。系统缺省的视点定义为方位角-37.5°,仰角30°。
例9.2 从不同视点绘制多峰函数曲面。 程序如下: 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')
9.1.3 色彩处理 1. 颜色的向量表示 MATLAB除用字符表示颜色外,还可以用含有3个元素的向量表示颜色。 2. 色图 色图是m×3 的数值矩阵,它的每一行是RGB三元组。色图矩阵可以人为地生成,也可以调用MATLAB提供的函数来定义色图矩阵。 除plot及其派生函数外,mesh、surf等函数均使用色图着色。图形窗口色图的设置和改变,使用函数: colormap(m) 其中m代表色图矩阵。 3. 三维表面图形的着色 三维表面图实际上就是在网格图的每一个网格片上涂上颜色。surf函数用缺省的着色方式对网格片着色。除此之外,还可以用shading命令来改变着色方式。
例9.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;
9.1.3 光照处理 MATLAB提供了灯光设置的函数,其调用格式为: light('Color',选项1,'Style',选项2,'Position',选项3) 例9.4 光照处理后的多峰函数曲面。 程序如下: z=peaks(20); subplot(1,2,1);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]);shading interp;hold on; plot3(20,0,10,'p');text(20,0,10,' light');
9.2 图像与动画 9.2.1 图像 1. imread和imwrite函数 imread和imwrite函数分别用于将图像文件读入MATLAB工作空间,以及将图像数据和色图数据一起写入一定格式的图像文件。 2. image和imagesc函数 这两个函数用于图像显示。为了保证图像的显示效果,一般还应使用colormap函数设置图像色图。
例9.5 在E盘根目录下有一图像文件building.jpg,在图形窗口显示该图像。 程序如下: [x,cmap]=imread('e:\building.jpg'); %读取图像的数据阵和色图阵 image(x);colormap(cmap); axis image off %保持宽高比并取消坐标轴
9.2.2 动画 1. getframe函数 getframe函数可截取每一幅画面信息而形成一个很大的列向量。该向量可保存到一个变量中。显然,保存n幅图就需一个大矩阵。 2. moviein函数 moviein(n)函数用来建立一个足够大的n列矩阵。该矩阵用来保存n幅画面的数据,以备播放。 3. movie函数 movie(m,n)函数以每秒n幅图形的速度播放由矩阵m的列向量所组成的画面。
例9.6 播放一个直径不断变化的球体。 程序如下 [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幅的速度播放球面
9.3 低层绘图操作 9.3.1 图形对象及其句柄 1. 图形对象 MATLAB把构成图形的各个基本要素称为图形对象。这些对象包括计算机屏幕、图形窗口(Figure)、坐标轴(Axes)、用户菜单(Uimenu)、用户控件(Uicontrol)、曲线(Line)、曲面(Surface)、文字(Text)、图像(image)、光源(Light)、区域块(Patch)和方框(Rectangle)。系统将每一个对象按树型结构组织起来。每个图形对象都可以被独立地操作。
2. 图形对象句柄 MATLAB在创建每一个图形对象时,都为该对象分配唯一的一个值,称其为图形对象句柄(Handle)。句柄是图形对象的唯一标识符。 MATLAB提供了3个用于获取已有图形对象句柄的函数: gcf 获取当前图形窗口的句柄(get current figure)。 gca 获取当前坐标轴的句柄(get current axis)。 gco 获取最近被单击的图形对象的句柄(get current object)。
9.3.2 图形对象属性 1. 属性名与属性值 MATLAB给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值成为属性值。例如,LineStyle是曲线对象的一个属性名,它的值决定着线型,取值可以是'-' 、':'、'-.'、'--'或'none'。 2. 属性的操作 set函数的调用格式为: set(句柄,属性名1,属性值1,属性名2,属性值2,…) get函数的调用格式为: V=get(句柄,属性名)
9.3.3 图形对象的创建 1. 图形窗口对象 建立图形窗口对象使用figure函数。调用该函数的命令形式为: 句柄变量=figure(属性名1,属性值1,属性名2,属性值2,…) MATLAB为每个图形窗口提供了很多属性。这些属性及其取值控制着图形窗口对象。除公共属性外,其他常用属性:MenuBar属性、Name属性、Position属性、Color属性等。
例9.7 建立一个图形窗口。该图形窗口没有菜单条,标题名称为“图形窗口示例”,起始于屏幕左下角、宽度和高度分别为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.'')');
例9.8 分别在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]);
2. 坐标轴对象 建立坐标轴对象使用axes函数,调用它的命令形式为: 句柄变量=axes(属性名1,属性值1,属性名2,属性值2,…) MATLAB为每个坐标轴对象提供了很多属性。除公共属性外,还有其他常用属性。
例9.9 利用坐标轴对象实现图形窗口的任意分割。 程序如下: 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‘);
3. 曲线对象 建立曲线对象使用line函数,调用它的命令形式为: 句柄变量=line(x,y,z,属性名1,属性值1,属性名2,属性值2,…) 其中对x,y,z的解释与高层曲线函数plot和plot3等一样,其余的解释与前面介绍过的figure和axes函数类似。 每个曲线对象也具有很多属性。除公共属性外,还有其他常用属性。
4. 文字对象 使用text函数可以根据指定位置和属性值添加文字说明,并保存句柄。调用该函数的命令形式为: 句柄变量=text(x,y,z,‘说明文字’,属性名1,属性值1,属性名2,属性值2,…) 其中说明文字中除使用标准的ASCII字符外,还可使用LATEX格式的控制字符。 除公共属性外,文字对象还有其他常用属性。
例9.10 利用曲线对象完成例4.5。 程序如下: 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); line(x,y1,'LineStyle',':','color','g'); line(x,y2,'LineStyle','--','color','b'); line(x1,y3,'LineStyle','none','Marker','p','color','r‘); title(’曲线及其包络线‘); xlabel('independent variable X‘); ylabel(’independent variable Y‘); text(2.8,0.55,’2e^{-0.5x}‘,’FontSize‘,12); text(0.45,0.55,’y=2e^{-0.5x}sin(2{\pi}x)‘,’FontSize‘,12); text(1.4,0.1,’离散数据点‘); legend(’包络线‘,’包络线‘,’曲线y‘,’离散数据点‘)
5. 曲面对象 建立曲面对象使用surface函数,调用它的命令形式为: 句柄变量=surface(x,y,z,属性名1,属性值1,属性名2,属性值2,…) 其中对x,y,z的解释与高层曲面函数mesh和surf等一样,其余的解释与前面介绍过的figure和axes等函数类似。 每个曲面对象也具有很多属性。除公共属性外,还有其他常用属性。
例9.11利用曲面对象绘制三维曲面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');