《MATLAB编程(第二版) 第九章.doc》由会员分享,可在线阅读,更多相关《MATLAB编程(第二版) 第九章.doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第九章 句柄图形39.1 MATLAB图形系统39.2 对象句柄49.3 对象属性的检测和更49.3.1在创建对象时改变对象的属性49.3.2 对象创建后改变对象的属性5例9.199.4 用set函数列出可能属性值129.5 自定义数据139.6 对象查找149.7 用鼠标选择对象15例9.2169.8 位置和单位189.8.1 图象(figure)对象的位置189.8.2 坐标系对象和uicontrol对象的位置189.8.3 文本(text)对象的位置19例9.3199.9 打印位置219.10 默认和factory属性229.11 图形对象属性239.12 总结239.13 练习241.
2、242.243.244.245.246.25第九章 句柄图形句柄图形是对底层图形函数集合的总称,它实际上进行生成图形的工作。这些函数一般隐藏于M文件内部,但是它们非常地重要,因为程序员可以利用它对图象或图片的外观进行控制。例如,我们可以利用句柄图形只对x轴产生网格线,或选择曲线的颜色为桔黄色,桔黄色plot命令中的标准LineSpec参数。还有,句柄图形可以帮助程序员为他们的程序创建用户图形界面,用户图形界面,我们将在下一章介绍。在本章中,我们向大家介绍MATLAB图形系统的结构,以及如何控制图形对象的属性。9.1 MATLAB图形系统MATLAB图形系统是建立图形对象的等级系统之上,每一个图
3、形对象都有一个独立的名字,这个名字叫做句柄。每一个图形对象都有它的属性,我们可以通过修改它的属性来修改物体的行为。例如,一条曲线是图形对象的一种。曲线对象有以下的属性:x数据,y数据,颜色,线的类型,线宽,符号类型等等。修改其中的一个属性就会改变图象窗口中的一个图象。由图形命令产生的每一件东西部是图形对象。例如,图形中的每一个曲线,坐标轴和字符串是独立的对象(拥有独立的名字句柄,还有形式)。所有的图象对象按子对象和父对象的形式管理,如图9.1所示。当一个子对象被创建时,它可能继承了父对象的许多属性。根对象(计算机屏幕)图形框架窗口对象图形框架窗口对象Uimenu对象Uicontrol对象坐标系
4、对象坐标系对象影像对象线条对象贴片对象文本对象曲面对象父对象子对象兄弟对象图9.1 对象的层次结构在MATLAB中最高层次的图形对象被根对象,我们可以通过它对整个计算机屏幕进行控制。当MATLAB启动时,根对象会被自动创建,它一直存在到MATLAB关闭。与根对象相关的属性是应用于所用MATLAB窗口的默认属性。在根对象下,有多个图象窗口,或只有图象。每一个图象在用于显示图象数据的计算机屏幕上都有一个独立的窗口,每一个图象都有它独立的属性。与图象相关的属性有,颜色,图片底色,纸张大小,纸张排列方向,指针类型等。每一个图形可包括四个对象:Uimenu对象,Uicontrol对象,坐标系对象和Uic
5、ontextmenus对象。Uimenu对象,Uicontrol对象,和Uicontextmenus对象是专门地用来创建用户图形界面的对象,它们将在下一章讨论。坐标系对象是指在用于显示图象的图片中的区域。在一个图象窗口中,它可能含有一个或多个坐标系。每一个坐标系对象可能包括曲线对象,文本对象,贴片对象,还有其他的你所需的图形对象。9.2 对象句柄每一个图象对象都有一个独一无二的名字,这个名字叫做句柄。句柄是在MATLAB中的一个独一无二的整数或实数,用于指定对象的身份。用于创建一个图象对象的任意命令都会自动地返回一个句柄。例如,命令Hnd1 = figure创建一个新的图象,并返回这个图象的句
6、柄到变量Hnd1。根对象句柄一般为0,图象(图)对象的句柄一般是一个小的正整数,例如1,2,3而其他的图形(graphic)对象为任意的浮点数。我们可以利用MATLAB函数得到图象,坐标系和其他对象的句柄。例如,函数gcf返回当前图象窗口的句柄,而函数gca则返回在当前图象窗口中的当前坐标系对象的句柄,函数gco返回当前选择对象的句柄。这些函数将会在后面将会被具体讨论。为了方便,存储句柄的变量名要在小写字母后面个H。这样就可以与普通变量(所有的小写变量,大写变量,全局变量)区分开来。9.3 对象属性的检测和更对象属性是一些特殊值,它可以控制对象行为的某些方面。每一个属性都有一个属性名和属性值。
7、属性名是用大小写混合格式写成的字符串,属性名中的每一个单词的第一个字母为大写,但是MATLAB中的变量名的大小不与区分。9.3.1在创建对象时改变对象的属性当一个对象被创建时,所有的属性都会自动初始化为默认值。包含有propertyname(属性名)的创建函数创建对象时,默认值会被跳过,而跳过的值在创建函数中有。例如,我们在第二章看到,线宽属性可以通过下面的plot命令改变。plot(x, y, LineWidth, 2);录一个曲线被创建时,函数用值2来替代它的默认值。9.3.2 对象创建后改变对象的属性我们可以用随时用get函数检测任意一个对象的属性,并用set函数对它进行修改。get函数
8、最常见的形式如下value = get(handle, PropertyName);value = get(handle);value是勤句柄指定对象的属性值。如果在调用函数时,只有一个句柄,那么函数将会返回一个结构,域名为这个对象的属性名,域值为属性值。set函数的最常用形式为set(handle,PropertyName1, value1, .);在一个单个的函数中可能有多个propertyname和value。例如,假设我们用下面的语句,画出函数y(x)= x2在(0,2)中的图象x = 0:0.1:2;y = x .2;Hnd1 = plot(x, y);图象如图9.2a所示。这个曲线
9、的句柄被存储在变量Hnd1内,我们可以利用它检测和修改这条曲线的属性。函数get(Hnd1)在一个结构中返回这条曲线所有的属性,每一个属性名都为结构的一个元素。 result=get(Hnd1)result = Color: 0 0 1 EraseMode: normal LineStyle: - LineWidth: 0.5000 Marker: none MarkerSize: 6 MarkerEdgeColor: auto MarkerFaceColor: none XData: 1x21 double YData: 1x21 double ZData: 1x0 double Being
10、Deleted: off ButtonDownFcn: Children: 0x1 double Clipping: on CreateFcn: DeleteFcn: BusyAction: queue HandleVisibility: on HitTest: on Interruptible: on Selected: off SelectionHighlight: on Tag: Type: line UIContextMenu: UserData: Visible: on Parent: 151.0012 DisplayName: XDataMode: manual XDataSour
11、ce: YDataSource: ZDataSource: 注意当前曲线的线宽为0.5pixel,线型为虚线。我们能够用这些命令改变线型和线宽。set(Hnd1,LineWidth,4,LineStyle,-)产生的结果图象如9.2b所示。(a)(b)图9.1(a)用默认值画出的函数y= x2的图象,(b)修改了线宽和线型的函数图象函数get和set对程序员来说非常的有用,因为它们可以直接插入到MATLAB程序中,根据用户的输入修改图象。在下一章,我们把它用于GUI编程。但对于最终的用户,他们要很容易地改变MATLAB对象的属性。属性编辑器是为了这个目的而设计的工具。启动属性编辑器的命令为pr
12、opedit(HandleList);propedit;这个函数第一个形式用于编辑所列出的句柄的属性,而这个函数的第二种形式用于编辑当前图象的属性。例如下面的语句创建函数y(x)=在(0,2)x2中的图象并打开属性编辑器,让用户间接地改变曲线的属性。figure(2);x = 0:0.1:2;y = x .2;Hnd1 = plot(x, y);propedit(Hnd1);我们用这些语句调用属性编辑器,如图9.3。属性编辑器包含了许多的窗格,用户可以根据对象的类型改变对象的属性。在例子中讨论的曲线对象,它窗格包括Date,Style,和Info。Date窗格允许用户选择和修改所要显示的数据它
13、可以修改X数据,Y数据和Z数据的属性。Style窗格用来线型和符号属性,Info用来设置曲线对象的其它信息。图9.3编辑曲线对象的属性编辑器。属性编辑器可以用图象工具条上的按钮调用,然后双击你所要编辑的对象。例9.1底层图形命令的应用函数sinc(x)的定义如下sinc x = x的取值从-3到3,画出这个函数的图象,用句柄图形函数画出图象,满足下面的要求1.使图象背景为粉红色2.只在y轴上有网格线3.曲线为3point宽,桔黄色的实线答案为了创建图象,我们需要计算x从-3到3之间的函数sincx,然后用plot命令画出它的图象。plot命令这条直线的句柄。画完直线后,我们需要修改figure
14、对象的颜色和axes对象的网格状态,以及line对象的颜色与线宽。这些修改需要我们访问图对象,axes对象,line对象的句柄。图对象的句柄由函数gcf返回,axes对象的句柄由函数gca返回,line对象由plot函数返回。需要修改的底层图形属性可以在MATLAB在线帮助工作台文件中找到,在主题Handle Graphics Objects目录下。它们包括当前图象的color属性,当前的坐标系的YGrid属性,以及曲线的LineWidth属性和color属性。1.陈述问题画出函数sincx的图象,x的取值从-3到3,图象背景为粉红色,只在y轴上有网格线,曲线为3point宽,桔黄色的实线2.
15、定义的输入与输出这个程序无输入,输出为指定的图象。3.设计算法这个问题可分为三大步Calculate sinc(x)Plot sinc(x)Modify the required graphics object properties这个程序的第一大步是计算x从-3到3之间的函数sincx。这个工作可以用向量化语句完成,但向量化语句在x=0时会产生一个NaN,因为0/0没有意义。在画这个函数之前我们必须用1.0替换NaN。这个步骤的伪代码为% Calculate sinc(x)x = -3*pi:pi/10:3*piy = sin(x) ./ x%Find the zero value and
16、fix it up. The zero is%located in the middle of the x array.index = fix(length(y)/2) + 1y(index) = 1下一步,我们必须画出这个函数的图象,并把所要修改的曲线的句柄存入一个变量。这个步骤的伪代码为Hndl = plot(x, y);现在,我们必须用句柄图形修改图象背景,y轴上的网格线,线宽和线色。图对象的句柄由函数gcf返回,axes对象的句柄由函数gca返回,line对象由plot函数返回。粉红色背景可由RGB向量1 0.8 0.8创建,桔黄色曲线可以由RGB向量1 0.5 0创建。伪代码如下se
17、t(gcf, Color, 1 0.8 0.8)set(gca, YGrid, on)set(Hndl, Color, 1 0.5 0, LineWidth, 3)4.把算法转化为MATLAB语言% Script file: plotsinc.m% Purpose:% This program illustrates the use of handle graphics% commands by creating a plot of sinc(x) from -3*pi to% 3*pi, and modifying the characteristics of the figure,% ax
18、es, and line using the set function.% Record of revisions:% DateProgrammerDescription of change% = =% 11/22/97 S. J. Chapman Original code% Define variables:% Hndl - Handle of line% x - Independent variable% y - sinc(x)% Calculate sinc(x)x = -3*pi:pi/10:3*pi;y = sin(x) ./ x;% Find the zero value and
19、 fix it up. The zero is% located in the middle of the x array.index = fix(length(y)/2) + 1;y(index) = 1;% Plot the function.Hndl = plot(x,y);% Now modify the figure to create a pink background,% modify the axis to turn on y-axis grid lines, and% modify the line to be a 2-point wide orange line.set(g
20、cf,Color,1 0.8 0.8);set(gca,YGrid,on);set(Hndl,Color,1 0.5 0,LineWidth,3);5.检测程序这个程序的检测是非常简单的,我们只要运行这个程序,并检查产生的图象就可以了。产生的图象如图9.4所示,它就是我们需要的样式。图9.4 sincx的图象9.4 用set函数列出可能属性值函数用于提供所有可能的属性值列表。如果在调用函数set时,只包括属性名而不包括相应的属性值,那么函数set就会返回所有的合法属性值。例如,命令set(Hnd1,LineStyle)将返回所有可能的线型,大括号中是默认的线型。 set(Hndl,LineSt
21、yle) - | - | : | -. | none 这个函数的合法包括和none,第一个是默认的类型。 set(Hndl,LineWidth)A lines LineWidth property does not have a fixed set of property values.函数set(Hnd1)返回一个对象的所有属性的所有可能的属性值。 set(Hndl)ans = Color: EraseMode: 4x1 cell LineStyle: 5x1 cell LineWidth: Marker: 14x1 cell MarkerSize: MarkerEdgeColor: 2x1
22、 cell MarkerFaceColor: 2x1 cell XData: YData: ZData: ButtonDownFcn: Children: Clipping: 2x1 cell CreateFcn: DeleteFcn: BusyAction: 2x1 cell HandleVisibility: 3x1 cell HitTest: 2x1 cell Interruptible: 2x1 cell Selected: 2x1 cell SelectionHighlight: 2x1 cell Tag: UIContextMenu: UserData: Visible: 2x1
23、cell Parent: DisplayName: XDataMode: 2x1 cell XDataSource: YDataSource: ZDataSource: 9.5 自定义数据除了一个GUI对象定义的标准属性以外,程序可以定义所要控制的数据的特殊属性。程序员可以用附加属性把任意类型的数据添加到GUI对象中。任意数量的数据可以被存储,并应用于各种目的。自定义数据可以用近似标准属性的形式存储。每一个数据条目都有一个名字和值。数据变量可以用函数setappdate存储在一个对象,并用函数getappdata接收。setappdate函数的基本形式如下setappdata(Hndl, Da
24、taName, DataValue);其中Hndl是数据存入的对象的句柄,DateName是这个数据的名字,而DateValue是赋于是这个名字的值。注意数据值可以是数字,也可以是字符串。例如,假设我们要定义两个特殊的数据值,其中一个用于存储发在指定图象中的错误数,另一个是用于描述最后发现的错误的字符串。这两个数据值的名字是ErrorCount和LastError。我们假设H1为这个图象的句柄,创建这些数据条目和初始化的命令为setappdata(Hl,ErrorCount,0);setappdata(H1,LastError,No error);我们可以用getappdata函数随时调用这些
25、数据。getappdata的两种形式如下value = getappdata(Hndl, DataName);struct = getappdata(Hndl);其中,Hnd1是包含有这个数据的对象句柄,DateName是要调用的数据的名字,如果一个DateName被指定,那么与DateName相关的值就会被返回。如果没有被指定,那么所有与这个对象形字相关的自定义值就会以结构的形式被返回。数据条目名就是结构元素名。对上面的例子来说,getappdata将会产生下面的结果 value = getappdata(Hl, ErrorCount)value = 0 value = getappdata
26、(Hl);struct = ErrorCount: 0 LastError: No error与自定义数据相关的函数被总结在表9.1中。表9.1 与自定义数据相关的函数函数描述setappdata(Hndl, DataName, DataValue)把DataValue存储在对象中的DataName,这个对象以Hndl为句柄。value = getappdata(Hndl, DataName)struct = getappdata(Hndl)从以Hndl句柄的对象重新调用程序,第一种形式只读取DataName中的数据,第二种形式重新所有的自定义数据。isappdata(Hndl, DataNa
27、me)如果DataName在以Hndl为句柄的对象中有定义,那就会返回1,否则返回0。isappdata(Hndl, DataName)删除DataName,DataName是在以Hndl为句柄的对象中的自定义数据。9.6 对象查找每一个新的图象在从创建开始时就有它们自已的句柄,句柄可以由创建函数返回。好的编程习惯如果你打算修改你创建的对象的属性,那么请保存对象的句柄,为以后调用函数get和set做准备。但是我们有时不能访问句柄。假设我们由于一些原因,丢失了对象的句柄。我们如何检测和图形对象呢?MATLAB提供了四个专门的函数,用来帮助寻找对象的句柄。l lgcf返回当前图象的句柄l lgca
28、返回当前图象中当前坐标系的句柄l lgco返回当前对象的句柄l lfindobj寻找指定属性值的图形对象函数gcf返回当前图象的句柄。如果这个图象不存在,gcf将会创建一个,并返回它的句柄。函数gca返回当前图象中当前坐标系的句柄,如果图象不存在,或当前图象中无坐标系,那么函数gca将创建一个坐标系,并返回它的句柄。函数gco的形式如下H_obj = gco;H_obj = gco(H_fig);其中,H_obj是一个对象的句柄,H_fig是一个图象的句柄。这个函数的第一种形式返回当前图象中的当前对象的句柄。它的第二种形式返回一指定图象中的当前对象的句柄。当前对象是指用鼠标单击的最一个对象。这
29、个对象可以是除了根对象的任意图形对象。直到鼠标在图象内发生了单击事件,在图象内才有一个当前对象。在单击事件发生之后,函数gco将返回一个空数组,不像函数gcf和gca,gco如果不存在就自动创建。一旦我们得知了一个对象的句柄,我们可以通过检测Type属性去时来确定对象的类型。Type属性是一个字符串,例如图,line,text等等。H_obj = gco;type = get(H_obj, Type)查找任意一个MATLAB对象最简单的方法是用findobj函数。它的基本形式如下Hndls = findobj(PropertyName1,value1, .)这个命令起始于根对象,并搜索所有的对
30、象,找出含有指定属性,指定值的对象。注意可以指定多个属性/值,findobj只返回与之匹配的对象句柄。例如,假设我们已经创建了图1和图3。那么函数findobj(Type,图)将会返回结果 H_fig = findobj(Type, figure)H_fig =31函数findobj的这种形式非常的有用,但却比较慢,因为它必须对整个对象树进行搜索。如果你必须多次用到一对象,只调用一次函数findobj,为了重复利用句柄,句柄应存储下来。限定搜索对象的数目能够加快函数运行的速度。它的形式为Hndls = findobj(SrchHndls, PropertyName1, value1, .)在这
31、里,只有数组srchHndls和它的子数组中的句柄,才在搜索的范围内。例如你想找到图1中的虚线。它的命令为Hndls = findobj(1, Type, line, LineStyle, -);好的编程习惯如果有可能的话,限定函数findobj的搜索范围将能加快函数的运行速度。9.7 用鼠标选择对象函数gco将返回当前对象,当前对象是指用鼠标最后一次单击的对象。每一个对象都有一个与之相关的可选择区,在可选择区内任意一个单击都可以看作对这个对象的单击。对于细小的对象(例如线,点)来说,这种特性是非常重要的。可选择区的宽度和形状由对象的类型确定。例如,一个曲线的可选择区在离直线5pixel的范围
32、内,而一个表面,一个小块和文本对象的可选择区是包含这些对象的最小长方形。对于一个坐标系对象来说,它的可选择区是坐标轴区域加上标题和标签的区域。但是在坐标轴内的曲线对象或其他对象有更高的优先权,你必须在单击坐标内的一点,并且不靠近直线和文本。如果单击坐标外的图象将会选择图象本身。如果一个用户单击了两个或多个对象的所在点,例如两线的交插点将会有什么事情发生。这取决于每一个对象堆垛顺序(stacking order)。堆垛顺序是MATLAB选择对象的顺序。在一个图象中所有的子对象属性句柄顺序就是堆垛顺序。如果单击了两个或多个对象的所在点,在堆垛顺序的优先权高的将会被选择。当选择图形对象时,我们有时可
33、以调用MATLAB内建函数waitforbuttonpress。这个函数的形式为k = waitforbuttonpress当这个函数运行时,它将会暂停程序,直到任意键按下或鼠标单击事件发生后,程序才恢复运行。如果按下了鼠标键函数将会返回0,按下任意键,函数将会1。函数经常用于暂停程序。当鼠标单击事件发生后,程序将会用gco函数恢复选择对象的句柄。例9.2 图形对象的选择在本例中的程序可以探测图形对象的属性,并显示如何用函数waitforbuttonpress和gco选择对象。程序允许用户可以多次重复选择对象。% Script file: select_object.m% Purpose:%
34、This program illustrates the use of waitforbuttonpress% and gco to select graphics objects. It creates a plot% of sin(x) and cos(x), and then allows a user to select% any object and examine its properties. The program% terminates when a key press occurs.% Record of revisions:% Date Programmer Descri
35、ption of change% = = =% 11/23/97 S. J. Chapman Original code% Define variables:% details - Object details% H1 - Handle of sine line% H2 - Handle of cosine line% Handle - Handle of current object% k - Result of waitforbuttonpress% type - Object type% x - Independent variable% y1 - sin(x)% y2 - cos(x)
36、% yn - Yes/No% Calculate sin(x) and cos(x)x = -3*pi:pi/10:3*pi;y1 = sin(x);y2 = cos(x);% Plot the functions.H1 = plot(x,y1);set(H1,LineWidth,2);hold on;H2 = plot(x,y2);set(H2,LineWidth,2,LineStyle,:,Color,r);title(bfPlot of sin itx rmbf and cos itx);xlabel(bfitx);ylabel(bfsin itx rmbf and cos itx);l
37、egend(sine,cosine);hold off;% Now set up a loop and wait for a mouse click.k = waitforbuttonpress;while k = 0 % Get the handle of the object Handle = gco; % Get the type of this object. type = get(Handle,Type); % Display object type disp (Object type = type .); % Do we display the details? yn = inpu
38、t(Do you want to display details? (y/n) ,s); if yn = y details = get(Handle); disp(details); end % Check for another mouse click k = waitforbuttonpress;end程序运行后,得到的结果如图9.5所示图9.5 sinx和cosx的图象。我们可以在图象内单击各种对象,并查看它的类型。9.8 位置和单位许多的MATLAB对象都包括位置(position)属性,它用来指定对象在计算机屏幕的位置和大小。这个属性在不同类型的对象中有细节的差别,这一点将在本节中
39、描述。9.8.1 图象(figure)对象的位置一个图象(图)的位置(position)用一个4元素行向量指定在计算机屏幕内的位置。在这个向量中的值为left bottom width height,其中left是指图象的左边界,bottom是指图象的底边界,width是指图象的宽度,height是指图象的高度。它的这些位置值的单位可以用对象的Units属性指定。例如,与当前图象的位置和单位可以用下面的语句得到。 get(gcf,Position)ans = 128 259 506 373 get(gcf,Units)ans =pixels这些信息说明当前图象窗口的左下角距屏幕右边的距离为17
40、6pixel,距屏幕底边的距离为204pixel。,图象的宽度为672pixel,上下高度为504pixel。注意这是图象的可作图区,包括边界,滚动条,菜单,还有图象的标题区。单位(units)属性的默认值为像素(pixels),但是它的属性值还可以为英尺(inches),公分(centimeters),点(points),或归一化坐标(normalixed coordinates)。像素代表了屏幕像素,即在屏幕上可表示出来的最小的对象。典型的计算机屏幕最小分辨为640480,在屏幕的每一个位置都有超过1000的像素。因为像素数因机算机屏幕的不同而不同,所以指定对象的大小也会随之改变。归一化坐
41、标是在0到1范围内。在归一化坐标中,屏幕的左下角为0,0右上角为1.0, 1.0。如果对象的位置归一化坐标系的形式描述,那么不同分辨率的显示器上对象的相对位置是固定的。例如,下面的语句创建了一个图象,把图象放置在屏幕的上部,而不用考虑显示器的大小。H = figure(1)set(H,units, normalized,position,0 .5 .5 .45)好的编程习惯如果你想把对象放置在窗口的特定位置,最好的方法是用归一化坐标,因为不用考虑显示器的大小。9.8.2 坐标系对象和uicontrol对象的位置坐标系对象和uicontrol对象的位置同样可以用一个4元素向量表示,但它是相对于f
42、igure对象的位置。一般说来,所有子对象的position属性都与它的父对象相关。默认地,坐标系对象在一图象内的位置是有归一化单位指定的,(0,0)代表图象的左下角,(1,1)代表图象的右上角。9.8.3 文本(text)对象的位置与其他对象不同,文本(text)对象有一个位置属性,包含两个或三个元素。这些元素为坐标系对象中文本对象的x,y和z轴。注意都显示在坐标轴上。放置在某一特定点的文本对象的位置可由这个对象的HorizontalAlignment和VerticalAlignment属性控制。HorizontalAlignment的属性可以是Left。Center,或Right。VerticalAlignment的属性值可以为Top,cap,Middle,Baseline或Bottom。文本对象的大小由字体大小和字符数决定,所以没有高度和宽度值与之相连。例9.3设置一个图象内对