1、110 句柄图形与第 7 章的高层指令相比,本章的内容更深入 MATLAB 可视化功能的内核。编写本章的目的有两个:一,使读者更深入地理解高层绘图指令,从而可绘制出更精细更生动更个性的图形;二,使读者能利用低层图形指令和图形对象属性开发专用绘图函数。本章在内容安排上有如下考虑: 保证概念、结构和方法的完整性:本章的前 6 节内容按由表及里、由浅入深的原则系统阐述句柄图形体系、图形对象、属性和操作方法。 突出要点、新点和难点:句柄图形体系有 11 个基本图形对象,每个对象的属性少则20 几个,多则近百个。对此,MATLAB 自带资料有详尽的文字说明。因此,本章只对最常用的、不可或缺的、MATLA
2、B 老版本中所没有的、以及较难掌握的内容进行说明。 强调“可操作性”体现“范例引导概念”的本书宗旨:针对 MATLAB 自带资料缺少完整、可操作应用实例的 弱点,本章设计了 17 个算例,其中 9 个精心设计的完整应用范例就占本章一半以上篇幅。读者通过阅读或操作这些范例,可掌握各指令、属性之间的有机配合,从而更具体更真切地理解句柄图形。在本章内容正式展开之前,先把 MATLAB 随带资料中涉及各对象属性的文件及查阅方法罗列如下。读者应重视这些最原始、最权威、最细节、任何其它书籍不能代替的资料。 使用 Adobe Acrobat Reader 阅读(或打印)以下 PDF 文件helppdf_do
3、cmatlabgraphg.pdf ;helppdf_docmatlabrefrefbook2.pdf ; 使用 Netscape Navigator 或 Microsoft Internet Explorer 打开以下引导文件helptechdocinfotoolhgpropdoc_frame.htm 使用指令 help 或 help window 图形用户界面查看有关对象的资料。如 help figure 可直接得到有关图对象的属性描述。 利用 get , set 指令在 MATLAB 指令窗中,直接查询对象属性。10.1句柄图形体系10.1.1图形对象、对象句柄和句柄图形树结构10.1.
4、2对象属性10.2图形对象的操作10.2.1图形对象创建指令一览10.2.2对象句柄的获取方法210.2.2.1 基本方法10.2.2.2 句柄获取示例【*例 10.2.2.2-1】画网线图,并得相应句柄;追溯法找所在图形窗句柄;gcf 和 gca 演示。clf reset;H_mesh=mesh(peaks(20)H_grand_parent=get(get(H_mesh,Parent),Parent)disp( 图柄 轴柄),disp(gcf gca) %显示当前图形窗和轴的句柄 H_mesh =73.0135H_grand_parent =1图柄 轴柄1.0000 72.0051图 10
5、.2.2.2_1【*例 10.2.2.2-2】低层指令绘图,获得句柄;获取同轴上字对象的句柄和相应对象类型。clf reset,t=(0:100)/100*2*pi;H_line=line(Xdata,t,Ydata,sin(t)text(pi,0.8,fontsize14sin(t)H_c=get(get(H_line,parent),children) %轴之所有“子”的句柄T=get(H_c,Type) %轴之所有“子”对象名称 H_line =72.0052H_c =74.011672.0052T = textline3 图 10.2.2.2_2【*例 10.2.2.2-3】findo
6、bj 指令的使用。clf reset,t=(0:pi/100:2*pi);tt=t*1 1;yy=sin(tt)*diag(0.5 1);plot(tt,yy),Hb=findobj(gca,Color,b) %在当前轴上寻找蓝线的句柄Hb =72.00500 图 10.2.2.2_310.3对象属性的获取和设置10.3.1创建对象时设置属性410.3.2get 和 set 10.3.3对象属性的缺省设置和查询10.3.4属性查询和设置示例【*例 10.3.4-1】创建二维图形时,分别用元胞数组和构架数组设置对象属性。clf reset,x=0:pi/12:2*pi;PN1=Color, Li
7、neWidth,Marker; %属性名元胞数组PV1=1 0 0, 5 , d; %属性值元胞数组plot(sin(x),cos(x),PN1,PV1) %高层指令,元胞数组属性对设置axis squarePS.Color=0.7 0.7 0;PS.LineWidth=2; %构架数组属性line(sin(7*x),cos(7*x),PS); % 低层指令,构架数组属性设置。 0 5 1 İ2 4 8 1图 10.3.4-1 创建对象时设置属性的二维图形【例 10.3.4-2】本例演示:影响 line 或 plot 画线时线型和色彩的“父”对象设置。(1)指令中直接指定线型或/和颜色:用“红
8、虚点线”绘所有曲线。clf reset;t=(0:pi/50:2*pi);k=0.4:0.1:1;Y=cos(t)*k;line(t,Y,Color,1 0 0,LineStyle,-.) % 50 1 3 5 02 1图 10.3.4_2_1(2)轴对象属性 LineStyle 和 ColorOrder 的影响:以“黑实黑虚灰实灰虚”的循环次序绘线。clf resetset(gca,ColorOrder,0 0 0;0.7 0.7 0.7,LineStyle,-|:) %line(t,Y) 0 1 2 3 4 5 6 6 8 1图 10.3.4_2_2(3)在“图对象”上,对轴的缺省属性 D
9、efaultAxesLineStyleOrder 和 DefaultAxesColorOrder 设置所产生的影响:以“红实蓝实红虚蓝虚”的循环次序绘线。clf resetset(gcf,DefaultAxesLineStyleOrder,-|:);set(gcf,DefaultAxesColorOrder,1 0 0;0 0 1);line(t,Y) 6 2 7 0 6 图 10.3.4_2_310.4为低层指令绘图准备图/ 轴10.4.1NextPlot属性10.4.2准备图/轴的简捷指令 newplot10.4.3高层绘图文件的形成【例 10.4.3-1】高层作图函数 surf.m 文件
10、与底层作图指令 surface 的关系。surf.m function h = surf(varargin)cax = newplot; % 准备图形窗和轴,并返回轴句柄。if nargin = 0error(Not enough input arguments.)elseif nargin = 1if min( size( varargin1 ) ) = 1error(Input argument must be a matrix not a vector or a scalar)elsehh = surface(varargin1);% 单输入宗量格式创建面endelsehh = surf
11、ace(varargin:); % 多输入宗量格式创建面endnext = lower(get(cax,NextPlot); % 把大写字母变为小写if ishold % 假如当前图形不处在hold on状态为真view(3) % 在默认视点观看三维图形grid on % 画分格线end7if nargout = 1h = hh; % 输出宗量数为1时,将 surface 的句柄赋给变量 h 。end10.5图形窗的色彩资源和光标属性10.5.1色彩资源10.5.2光标指针10.5.2.1 预定义的指针形状10.5.2.2 自定义指针形状10.6轴对象10.6.1轴位框的几何属性和多轴位框10
12、.6.2图形名和坐标轴名的句柄操作10.6.3轴刻度的属性控制10.6.4坐标轴尺度、方向、位置属性10.6.5照相机属性10.7句柄图形应用专题10.7.1光标形状的自制【*例 10.7.1-1】自制光标指针形状(本例只能在指令窗中运行、体验)。(1)运行以下指令,在屏幕的右上方(即第一象限)创建一个背景为“橘黄”色的图形窗,窗名为“试验窗”。(图形窗的外形见图 10.7.1-1-2)bdw=0.01; %左右两侧边和底边的宽度tpw=0.15; %顶边宽度不能太小pos=1/2+bdw,2/3+bdw,1/2-2*bdw,1/3-bdw-tpw; %figure(Units,normali
13、zed,Position,pos,Color,0.9,0.65,0)%set(gcf,Name,试验窗) % 8(2)为该图形窗制作一个“手指”状光标指针P=ones(16,16)*NaN;P(1,5)=1;P(2:14,4)=1;P(15,5)=1;P(16,6:11)=1;P(15,12)=1;P(9:14,13)=1;P(2:9,6)=1;P(9,7)=1;P(8,8)=1;P(9,9)=1;P(8,10)=1;P(9,11)=1;P(8,12)=1;P(2:14,5)=2;P(10:15,6:11)=2;P(9,8)=2;P(9,10)=2;P(9:14,12)=2;set(gcf,P
14、ointer,Custom,PointerShapeCData,P,PointerShapeHotSpot,2,5) 图 10.7.1-1-2 自定义窗名、背景色和光标形状的图形窗10.7.2任意布置子图和轴外注释【*例 10.7.2-1】本例演示: axes 轴位框设计、rectangle 的运用、及轴外注释。所谓轴外注释,实际上是使用了两个轴位框。一个轴位框充满全部图形窗,其坐标框被隐去,而只写注释文字。而另一个比较小的轴位框用于绘图。这样从外表看去,注释就处于那小轴位框的外部。clf%图形数据的产生zeta2=0.2 0.4 0.6 0.8 1.0;n=length(zeta2);for
15、 k=1:n;Numk,1=1;Denk,1=1 2*zeta2(k) 1;endS=tf(Num,Den); %产生单输入多输出系统t=(0:0.4:20); %时间采样点Y,x=step(S,t); %单输入多输出系统的响应tt=t*ones(size(zeta2); %为画彩带图,生成与函数值Y维数相同的时间矩阵。%产生全窗轴位框,并隐去坐标轴clf reset,H=axes(Position, 0, 0, 1, 1, Visible, off);%产生包含多行字符串的元胞数组str1=fontname隶书 二阶系统阶跃响应; %str2=y(t) = 1 - beta-1e-zetat
16、sin(betat + theta);str3= ;str4=fontname隶书 其中:;str5=beta = (1 - zeta2)0.5;str6=theta = arctg(beta/zeta);str7=zeta = .2, .4, .6, .8, 1; %使H 句柄轴对象成为当前轴,然后注释多行文字。set(gcf, CurrentAxes,H) %text(0.01, 0.73, str, FontSize, 12) %h1=axes(Position, 0.45, 0.45, 0.5, 0.5); %产生右半窗的轴位框ribbon(tt,Y,0.4) %在h1 轴位框中画彩带
17、图%对X 轴、Z轴重标刻度值set(h1,XTickLabelMode,manual,XTickLabel,0|0.4|0.8|1.2);%set(h1,ZTickLabel,0|1.0|2.0); %低层指令标识轴名9set(get(h1,XLabel),String,zeta rightarrow,Rotation,17.5)set(get(h1,YLabel),String,leftarrow t,Rotation,-25) %set(get(h1,Zlabel),String,y rightarrow)h2=axes(Position,0.03, 0.08, 0.27, 0.27);%
18、在左下角,产生小的轴位框。plot(tt,Y) %在h2 轴对象上画二维图%在右下方画系统方块框图h3=axes(Position,0.37,0.04,0.63,0.32); %设置画框图的轴位框set(h3,Xlim,0,1.2,Ylim,0,0.5) %设置轴的刻度范围set(h3,DataAspectRatio,1 1 1) %设置刻度比例set(h3,ColorOrder,0,0,0) %设置绘线的首选用色set(h3,Visible,off) %隐去坐标轴hh1=rectangle(Position,0.5,0.2,0.4,0.2,Curvature,0,0);%画方框 hh2=re
19、ctangle(Position,0.2,0.26,0.08,0.08,Curvature,1,1);%画圆框 xx1=0.05:0.01:0.2;xx2=0.28:0.02:0.5;xx3=0.9:0.02:1.1;xx4=0.24:0.02:1;yy5=0.1:0.02:0.26;yy6=0.1:0.02:0.3;yy1=0.3*ones(size(xx1);yy2=0.3*ones(size(xx2);yy3=0.3*ones(size(xx3);yy4=0.1*ones(size(xx4);xx5=0.24*ones(size(yy5);xx6=ones(size(yy6);line(
20、xx1,yy1);line(xx2,yy2);line(xx3,yy3);line(xx4,yy4);line(xx5,yy5);line(xx6,yy6)line(0.17,0.3,Marker,MarkerFaceColor,k)line(0.47,0.3,Marker,MarkerFaceColor,k)line(1.1,0.3,Marker,MarkerFaceColor,k)line(0.24,0.23,Marker,MarkerFaceColor,k)line(0.17,0.35,Marker,+)text(0.27,0.23,-)text(0.05,0.35,u(t)text(1
21、,0.35,y(t)text(0.6,0.26,s2 + 2zetas);xx7=0.56:0.02:0.84;yy7=0.3*ones(size(xx7);line(xx7,yy7)text(0.68,0.35,1) 传 e t楳 ) 2) 5 愠 捲 杴 ( /) 8 2 0 0 0 02 2 s1图 10.7.2-1 轴属性设置的综合演示1010.7.3制作个性化双坐标系【*例 10.7.3-1】制作一个双坐标系用来表现高压和低温两个不同量的过渡过程。tp=(0:100)/100*5;yp=8+4*(1-exp(-0.8*tp).*cos(3*tp); %压力数据tt=(0:500)/5
22、00*40;yt=120+40*(1-exp(-0.05*tt).*cos(tt); %温度数据%产生双坐标系图形clf reset,h_ap=axes(Position,0.13,0.13,0.7,0.75); %set(h_ap,Xcolor,b,Ycolor,b,Xlim,0,5,Ylim,0,15);nx=10;ny=6; %pxtick=0:(5-0)/nx):5;pytick=0:(15-0)/ny):15; %set(h_ap,Xtick,pxtick,Ytick,pytick,Xgrid,on,Ygrid,on)h_linet=line(tp,yp,Color,b); %set
23、(get(h_ap,Xlabel),String,时间 rightarrow (分))set(get(h_ap,Ylabel),String,压力 rightarrow(times10 5 Pa )h_at=axes(Position,get(h_ap,Position); %set(h_at,Color,none,Xcolor,r,Ycolor,r); %set(h_at,Xaxislocation,top) %set(h_at,Yaxislocation,right,Ydir,rev) %set(get(h_at,Xlabel),String,fontsize15fontname隶书时间
24、rightarrow (分))set(get(h_at,Ylabel),String, ( circC )fontsize15 leftarrow fontname隶书零下温度)set(h_at,Ylim,0,210) %line(tt,yt,Color,r,Parent,h_at) %xpm=get(h_at,Xlim); %txtick=xpm(1):(xpm(2)-xpm(1)/nx):xpm(2); %tytick=0:(210-0)/ny):210; %set(h_at,Xtick,txtick,Ytick,tytick) % 5 1 5 2 5 5 4 5 50 55 5 İ 0
25、5 0 0 图 10.7.3-1 双坐标系图形10.7.4连续变焦和飞驰图形【*例 10.7.4-1】通过 CameraPosition 设置的不断变化,使地球迎面飞来,贯穿而过,从地11球另一面飞离而去。但在整个飞行过程中,相机镜头始终对着地球。(1)编写三维地球生成程序 earth_zzy.m 函数文件earth_zzy.mfunction earth_zzy(ap)%erath_zyy.m 绘制三维地球% ap 取0时,相机视角采用自动设置;% 取1时,相机视角取缺省值的十分之一,因此地球显得较大。load topo %装载图象topo 和相应的图象色图 topomap1 figure(
26、colormap,topomap1,Color,.8 .8 .8); %设置图形窗的色图和背景色x,y,z = sphere(50);azzy.DataAspectRatio = 1 1 1;azzy.PlotBoxAspectRatioMode = auto;fa = axes(Visible,off, azzy); %设置轴的数据宽高比和坐标框三度比szzy1.AmbientStrength = 0.1;szzy1.DiffuseStrength = 1;szzy1.SpecularColorReflectance = .5; szzy1.SpecularExponent = 20;szz
27、y1.SpecularStrength = 1;surface(x,y,z,szzy1,FaceLighting,phong,FaceColor,texture,.EdgeColor,none,Cdata,topo,Parent,fa);%设置面对象 if ap=1,set(fa,CameraViewAngle,0.1*get(fa,CameraViewAngle);end light(position,-1 0 1,color,0.5 1 0.5);light(position,-1.5 0.5 -0.5,color,.6 .2 .2);light(Position,1.5 1.5 -1);
28、light(Position,0 -1.5 0,color,0.6 0.6 1);view(-17 26) (2)运行 erath_zzy 可以画出如下三维地球图。(在 Notebook 和指令窗中均可运行)earth_zzy(0) 图 10.7.4-1 三维地球图形(3)编写飞驰程序 fly_zzy.m 脚本文件fly_zzy.m%fly_zzy.m 连续改变相机位置,产生贯穿地球的效果earth_zzy(0) % 调用函数文件,产生三维地球图形。 set(gca,CameraViewAngleMode,manual) %pos=get(gca,CameraPosition); %获取相机初
29、始位置tar=get(gca,CameraTarget); %获取相机目标位置kk=(0:2:40)/15;nk=length(kk); %for i=1:nk-1newpos=pos-kk(i)*(pos-tar); %计算新位置 12set(gca,CameraPosition,newpos) %设置相机新位置 drawnow %end(4)在指令窗中运行以下指令 ,就会产生贯穿地球的效果。fly_zzy【*例 10.7.4-2】利用属性 CameraViewAngle 产生飞驰效应。本例也用地球图形演示。在相机视角连续变化下,地球飞离,直到消失。编写以下 M 脚本文件,并在指令窗中运行。
30、fly_zzy2.m%fly_zzy2.m 飞离而去的地球消失在远方earth_zzy(1) %调用earth_zzy函数画地球set(gca,CameraViewAngleMode,manual)ang=get(gca,CameraViewAngle); %获得当前所用相机视角kk=(1:50)/50;nk=length(kk);for i=1:nknewang=ang+kk(i)*(180-ang); %使相机视角不断变大set(gca,CameraViewAngle,newang) %设置新视角drawnow %迫使MATLAB更新屏幕end10.7.5实时动画10.7.5.1 擦除属性
31、 EraseMode10.7.5.2 屏幕刷新指令 drawnow10.7.5.3 动画制作示例【*例 10.7.5.3-1】制作红色小球沿一条带封闭路径的下旋螺线运动的实时动画。(1)编写函数文件 anim_zzy1.manim_zzy1.mfunction f=anim_zzy1(K,ki)% anim_zzy1.m 演示红色小球沿一条封闭螺线运动的实时动画% 仅演示实时动画的调用格式为 anim_zzy1(K)% 既演示实时动画又拍摄照片的调用格式为 f=anim_zzy1(K,ki)% K 红球运动的循环数(不小于1)% ki 指定拍摄照片的瞬间,取 1 到 1034 间的任意整数。%
32、 f 存储拍摄的照片数据,可用image(f.cdata)观察照片。% 产生封闭的运动轨线t1=(0:1000)/1000*10*pi;x1=cos(t1);y1=sin(t1);z1=-t1;t2=(0:10)/10;x2=x1(end)*(1-t2);y2=y1(end)*(1-t2);z2=z1(end)*ones(size(x2);t3=t2;z3=(1-t3)*z1(end);x3=zeros(size(z3);y3=x3;t4=t2;x4=t4;y4=zeros(size(x4);z4=y4;13x=x1 x2 x3 x4;y=y1 y2 y3 y4;z=z1 z2 z3 z4;p
33、lot3(x,y,z,b),axis off % 绘制曲线% 定义“线“色、“点“型(点)、点的大小(40)、擦除方式(xor)h=line(Color,1 0 0,Marker,.,MarkerSize,40,EraseMode,xor);% 使小球运动n=length(x);i=1;j=1;while 1 % 无穷循环set(h,xdata,x(i),ydata,y(i),zdata,z(i); % 小球位置drawnow; % 刷新屏幕 pause(0.0005) % 控制球速 i=i+1;if nargin=2 f=getframe(gcf);end % 拍摄i=ki时的照片 endi
34、f in i=1;j=j+1;if jK;break;endendend (2)在指令窗中运行以下指令,就可看到实时动画图形。f=anim_zzy1(2,450);(3)显示拍摄的照片image(f.cdata),axis off 图 10.7.5.3-1 红球沿下旋螺线运动的瞬间照片10.7.6 surface 指令衍生不同曲面【*例 10.7.6-1】演示高层指令 mesh, surf 等指令是如何由 surface 衍生而得。clf reset,t=(0:20)/20;r=2.5-cos(2*pi*t);x,y,z=cylinder(r,40);fc = get(gca,color);
35、%获得轴的背景颜色h=surface(x,y,z,FaceColor,fc,EdgeColor,flat,FaceLighting, none,EdgeLighting,flat);%把 FaceColor 设置为背景色,产生网线图view(3); grid on 14图 10.7.6-1-1 低层指令产生的网线图% FaceColor 属性只要不设置为 none 或轴背景色,便产生曲面图。set(h,FaceColor,flat,LineStyle,-,EdgeColor,.8 .8 .8) % 图 10.7.6-2 通过属性重置获得着色曲面图% MeshStyle 属性的单线设置,可产生瀑
36、布水线图。set(h,FaceColor,interp,MeshStyle,column) % 15图 10.7.6-3 通过重置获得新型瀑布水线图10.7.7纹理影射和曲面彩绘【*例 10.7.7.-1】在曲面上彩绘 unit8 编址图象: FaceColor 的属性值取 TextureMap ; CData 取从图象读得的色彩数据;CDataMapping 取 direct 。clf reset,t=(0:20)/20;r=2.5-cos(2*pi*t); %产生旋转圆柱体的母线x,y,z=cylinder(r,40); %获得旋转圆柱体的三维数据%读取 matlabtoolboximag
37、esimdemostrees.tif 图象文件C,CMAP=imread(trees.tif);CC=double(C)+1; %必须把 unit8 编址图象数据变换为双精度格式%通过属性设置,进行彩绘。surface(x,y,z,Cdata,flipud(CC),FaceColor,texturemap,EdgeColor,none,CDataMapping,direct,Ambient,0.6,diffuse,0.8,speculars,0.9)colormap(CMAP) %必须使用原图象的色图view(3),axis off 图 10.7.7-1 曲面的彩绘1610.7.8三维块建模和
38、着色10.7.8.1 创建块对象的顶点坐标法【*例 10.7.8.1-1】顶点坐标法创建三维长方块。clf reset,k=8; %k 的取值不影响着色X=0 1 1 0;1 1 1 1;1 0 0 1;0 0 0 0;0 1 1 0;0 1 1 0;Y=5*0 0 0 0;0 1 1 0;1 1 1 1;1 0 0 1;0 0 1 1;0 0 1 1;Z=0 0 1 1;0 0 1 1;0 0 1 1;0 0 1 1;0 0 0 0;1 1 1 1;FC=k:(k+size(Z,2)-1);patch(X,Y,Z,FC),set(gca,Projection,pers) %使轴采用透视投影v
39、iew(-20 -12),colormap(jet),axis equal 图 10.7.8.1-1 长方块的透视三维图10.7.8.2 创建块对象的“顶/面”法【*例 10.7.8.2-1】“顶/面”法创建块对象。clf resetVM=0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1;1/2 1/2 1+sqrt(2)/2;FM=1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8;5 6 9 nan;6 7 9 nan;7 8 9 nan;%VC=jet(9);FC=interp; %确定面的着色方式patch(Vertices,V
40、M,Faces,FM,FaceVertexCData,VC,FaceColor,FC)set(gca,Visible, off,DataAspectRatio,1 1 1) %view(-127 62) 17图 10.7.8.2-1 插补着色“顶/面”法创建的块10.7.9鼠标拖动字对象【例 10.7.9-1】本程序有两个功能:把当前图形窗中已存在的任何字对象拖放到所需的位置;向当前图形窗输入字对象,并拖放到任何所需位置。(1)编写以下程序textzzy.mfunction textzzy(arg)% textzzy.m 向当前图形窗输入“字对象”,并用鼠标移放到需要的地方% arg 任何合法
41、的“字符串”,或“字符串元胞数组”,或数值% 调用格式 textzzy(S_C) 输入串、串元胞S_C,并可用鼠标拖动% 调用格式 textzzy 可移动当前图形窗中已有的任何字对象if nargin;arg=0;endif ischar(arg)|iscell(arg) %以下指令向图形窗输入串或串元胞PT.Units=normalized;PT.Position=0.01 0.01; %字符串进入图形窗的初始位置PT.String=arg;PT.HorizontalAlignment=left; %字符串的水平定位方式PT.VerticalAlignment=baseline; %字符串的
42、垂直定位方式ht=text(PT); %采用构架设置字对象属性,创建对象。textzzy(0) %递归调用textzzy.melseif arg=0 %为鼠标操作准备条件hf=get(0,CurrentFigure); %获取当前图形窗的句柄if isempty(hf)error(图形窗不存在。)endPF1.BackingStore=off; %为加快拖动速度,释放屏幕象素缓冲器。PF1.WindowButtonDownFcn=textzzy(1); %等待鼠标按下左键,递归运行textzzy(1)set(hf,PF1) %采用构架设置图对象属性figure(hf) %把当前图形窗调到前台e
43、lseif arg=1 %在此设置下,字对象框的左下顶点确定位置PO1.EraseMode=xor; %设置旧对象的擦除模式PO1.HorizontalAlignment=left;PO1.VerticalAlignment=baseline;set(gco,PO1) %采用构架设置选定对象的属性PF2.Pointer=fleur; %设置移动光标的形状PF2.WindowButtonMotionFcn=textzzy(2); %移动鼠标时,递归运行textzzy(2)PF2.WindowButtonUpFcn=textzzy(999); %松开鼠标,递归运行textzzy(999)set(g
44、cf,PF2) %采用构架对图形窗属性再设置elseif arg=2 %拖动字对象curpoi=get(gca,CurrentPoint); %获得鼠标所在新位置的坐标set(gco,Position,curpoi(1,1:3) %使所选对象定位在新坐标处elseif arg=999 %松开鼠标便属性重置为原缺省状态set(gco,EraseMode,normal)PF3.WindowButtonDownFcn=; %恢复设置为缺省值,即空串PF3.WindowButtonMotionFcn=;PF3.WindowButtonUpFcn=;PF3.Pointer=arrow; %光标恢复成箭头PF3.Units=pixels;PF3.BackingStore=on; %重新起用象素缓冲器set(gcf,PF3) %把图形窗设置为缺省状态else %假如鼠标选择的不是“字对象”,恢复缺省设置PF4.WindowButtonDownFcn=;PF4.WindowButtonMotionFcn=;PF4.WindowButtonUpFcn=;PF4.Pointer=arrow;PF4.Units=pixels;PF4.BackingStore=on;set(gcf,PF4)end