图形对象和句柄.ppt
第14章 图形对象和句柄,本书在第12章向读者详细介绍了MATLAB的数据可视化功能,即如何通过运用MATLAB的绘图函数和图形绘制窗口绘制用户需要的二维、三维等图形,相信读者通过学习,已经应该对于“高级”绘图的运用有了一定程度的了解。正如笔者提到的一样,MATLAB 7.0中的“高级”绘图指令往往不能使用户对于图形绘制了解得很透彻,如果用户需要通过了解“低层”绘图指令和图形对象属性开发函数,来对高级绘图指令的形成原理进行深入理解,并绘制出更加个性化的图形,那么读者应该仔细阅读本章。本章首先简要介绍了MATLAB图形对象的相关概念、体系结构等;MATLAB中需要通过句柄访问和控制图形对象,因此第14.2节讨论对象句柄的概念及其访问;第14.3节介绍了MATLAB中对象属性的查询、设置;第节分别讨论了两类重要的MATLAB图形对象,即窗口对象和轴对象;第14.6节介绍了图形输出控制相关的属性设置;第14.7节介绍M文件内句柄的存储及MATLAB内建函数对句柄的操作,最后第14.8节对本章进行了小结。,14.1 图形对象概述,图形对象(Graphics Object)是MATLAB 7.0提供给用户的一种用于创建计算机图形的面向对象的图形系统,该系统提供给用户创建线、字、网格、面及图形用户界面(GUI,有关内容详见本书第17章)的多种3绘图指令。第12章所介绍的各种“高级”指令都是以图形对象为基础生成的,所以图形对象也称为低层图形。低层指令的调用,没有高层指令那样简明清晰、通俗易懂,但是低层指令可以直接对图形的基本要素进行操作的特点决定了使用者可以让绘制的图形更加个性化,更加具有表现力。,14.1.1 图形对象的体系结构,图形对象是MATLAB中用来显示数据和创建GUI的基本绘图元素,对象的每个实例(instance)都对应唯一的标识符(Identifier),此标识符称为对象的句柄(handle),句柄由系统设定,用户不能改变。用户可以利用句柄轻松地操作现有图形的各项特征,即设置对象属性。MATLAB的图形对象体系结构中包含各种具有继承关系的对象,其关系有“父子”(从属)关系和“兄弟”(平行)关系两种,具体如图14.1所示。,14.1.2 图形对象的类型,本小节主要是在节的基础上向用户详细介绍各种类型的图形对象。(1)根对象。(2)图形窗口对象(Figure)。(3)用户界面对象(UI objects)。用户界面对象是图形窗口对象的一个子对象,其用来创建用户界面的若干相关图形。(4)轴对象(Axes)。轴对象和用户界面对象是平行的兄弟关系。,14.1.3 MATLAB中对象的属性,MATLAB中各级对象的属性控制其各种外观和显示特性。对象的属性包括公共属性(如对象类型、父、子对象、是否可见等)和不同类型对象的特有属性。例如,通过任何给定的图形对象,用户可以获取窗口中的最后击键、鼠标指针位置,或是最后选中的菜单句柄。,14.2 访问对象句柄,MATLAB中创建的任何对象都由系统赋予一个句柄,所有构造函数的返回值即为其所创建对象的句柄。节已经向读者介绍了对于对象属性的查询和设置,读者已了解到,如果需要做到对于对象属性的操作(查询或设置),则必须在对象创建之初就将其句柄保存在变量中,作为准备;如果用户觉得这样比较烦琐,或者偶尔忘记了保存,则还可以调用findobj函数或罗列其父对象的Children属性来获取现有对象的句柄。读者应该很清楚,根对象的句柄为0,而其子对象,图形窗口对象的句柄一般有两种情况:整数:默认显示在窗口标题栏中;浮点数:具有完全的MATLAB内部精度。,14.2.1 获取当前对象的句柄,MATLAB中,有关句柄图形的一个极为重要的概念是当前性(Be Current)。例如,当前的窗口即为接受绘制函数输出的窗口;当前的坐标轴就是创建坐标轴子对象的命令输出目标坐标轴;而当前的图形对象则为最后创建的图形对象,或被用户用鼠标点击选中的图形对象。用户可以直接把调用绘图函数的返回值存放在一个变量中,那么这个变量就是相应图形的句柄。另外一种获取当前对象句柄的常用方法是调用get函数,get函数的调用格式和功能系统地阐述如下。,14.2.2 调用findobj函数通过属性值查询对象,MATLAB提供给用户findobj函数,用于通过对属性值的搜索来查询对象句柄。findobj函数可以快速形成一个结构层次的截面并获得具有指定属性值的对象句柄,如果用户没有指定起始对象,那么系统默认findobj函数从Root对象开始,搜索与用户指定属性名和属性值相符的所有对象。用户希望将字符串sin(t)=.707从当前位置点pi/4,sin(pi/4)移动到点3*pi/4,sin(3*pi/4),这两个位置点的函数值相同。为了实现移动操作,用户首先要获得字对象的句柄,然后通过使用这个获得的句柄修改字对象的属性Position。,14.2.3 使用句柄操作对象,本节主要讲解如何利用句柄,完成对于对象的复制和删除操作。(1)调用copyobj函数复制对象。用户利用MATLAB中的copyobj函数,可以将对象a1从其父对象中复制到另一个对象中,生成新的对象a2,则a1和a2的区别有2点:父对象不同;对象句柄不同。(2)调用delete函数删除对象。MATLAB中,用户可以使用delete函数,删除一个对象,其参数是此对象的句柄。例如,用户可以需要删除当前的坐标轴,代码如下:delete(gca),14.3 设置和访问MATLAB对象属性,MATLAB提供了set和get两个函数,分别可以使用户设置和返回现有图形对象的属性值。利用这两个函数,还可以列出具体固定设置的属性的所有值。两个函数的基本调用格式如下:set(object_handle,PropertyName,NewPropertyValue);returned_value=get(object_handle,PropertyName)。以上两函数调用格式中,object_handle代表对象句柄,PropertyName代表属性名称,NewPropertyValue代表用户设置的属性值。注意:函数调用格式中的属性名称为引用的字符串,而属性值则根据与不同的属性而变换类型。,14.3.1 设置属性值,调用set函数,并利用对象的返回句柄,用户可以设置现有对象的属性,例如,下面的代码将y轴移动到图形的当前坐标系的左边。set(gca,YAxisLocation,left)如果句柄参数是一个矢量,则MATLAB将所有标识的对象均进行属性的设置。用户还可以运用构架和元胞数组设置属性名称和属性值,这在设置多个对象的相同属性时非常奏效。view1.CameraViewAngleMode=manual;view1.DataAspectRatio=1 1 1;view1.ProjectionType=Perspective;,14.3.2 查询属性值,MATLAB中,用户可以调用get函数来查询对象属性的当前值。(1)单个属性值的查询:调用get函数获取对象属性,用户可以得到该属性中的所有数据(2)返回构架:如果用户将get函数的返回值赋给一个变量,那么MATLAB将创建一个构架数组。(3)查询属性组:用户也可以首先定义属性名称的元胞数组,然后便捷地获取相应的属性值。,14.3.3 默认属性,以上两小节,向读者介绍了如何设置和查询MATLAB中对象的属性,实际上,MATLAB中的所有对象属性都有系统内建的默认值,即出厂设置值;当然,用户也可以自行定义任何一个MATLAB对象的默认属性值。,14.4 图形窗口对象,MATLAB图形窗口对象是用于显示MATLAB中图形输出的窗口,所以图形窗口对象的属性可以决定输出窗口的多种特征。本节主要介绍图形窗口对象的属性设置,这些属性与窗口的大小、位置、色彩、曲线绘制方式及指正样式有关。,14.4.1 设置图形窗口的位置属性,图形窗口对象的位置(Position)属性决定图形窗口在屏幕上的大小和位置,位置属性的默认设置是:图形大小是屏幕大小的1/4,且位于上半屏幕的中间位置。在MATLAB中,图形窗口的位置属性是一个矢量:left bottom width height。其中left和bottom确定窗口左下角的位置,而width和height分别确定窗口的宽和高,如图所示。,14.4.2 设置图形窗口的色彩属性,色彩属性关系到MATLAB使用系统色彩资源的方式,用户对色彩属性的设置,将影响图形窗口子对象的绘制上色速度和精确度。,14.4.3 图像窗口的绘制模式,MATLAB允许用户选择不同的方式来绘制图形,方式的选择主要取决于所绘制图形的类型。决定MATLAB绘制图形的方式有下面4种。BackingStore:当图形被遮挡部分显露出来时,确定是否重绘。DoubleBuffer:为简单动画生成渲染效果。Renderer和RendererMode:指定不同的渲染方法,或由MATLAB选择。,14.4.4 定制图形窗口的光标,除了对绘制方式的选择,MATLAB还提供了多种指针符号,供用户选择。在图形窗口中,图形符号表示指针位置,用户可以选择系统预定义的15种指针符号,也可以自行设置指针符号。指针符号的属性值、标识及具体功能,,14.5 轴对象,轴对象是图形窗口对象的子对象,也是众多重要对象的父对象(参看第14.1节),在图形对象的结构中,是十分重要的一环。轴对象的属性众多,功能主要为控制图像各方面信息的显示。本节就其重要的属性进行介绍。,14.5.1 设置轴对象的位置属性,同图形窗口对象一样,轴对象的几何属性分别是位置属性“Position”和单位属性“Units”,决定了轴对象在图形窗口对象中的位置、大小和轴对象的单位。值得读者注意的是,这些属性与图形窗口对象有不同之处。在图形是二维曲线时,轴位框和坐标框两者完全重合,,14.5.2 设置轴对象的刻度、刻度标记及坐标轴方向属性,本节以一个实例讲解单轴对象控制刻度、刻度标记及坐标轴方向的属性。,14.5.3 轴对象的多轴重叠,本书在第12章中曾介绍过的subplot函数可以完成单图多轴的绘制,使用subplot函数可把一个图形窗口按位置等分成多个“子块”,分别在每一部分绘制独立的图形。在此基础上,本小节讲解轴对象的“多轴重叠属性”,即允许用户在一个图形窗口对象中绘制多个重叠轴对象。,14.5.4 轴对象的自动模式属性,自动模式属性(Automatic-Mode Properties)又常被称为“照相机属性”。用户可以在轴对象属性的基础上设置MATLAB照相机属性,MATLAB照相机属性如表所示。,14.6 控制图形输出,本书在以前的章节多次提到,MATLAB允许用户同时打开多个绘图窗口,但是,当前窗口只能有一个,也就是说尽管用户打开的窗口不止一个,但系统运行的结果输出只能显示在众多窗口中的一个中,那么如何使用句柄保证输出的窗口是用户指定的窗口,而同时保证其他窗口不受输出结果的影响,这就是本节要主要介绍的问题。,14.6.1 定制图形输出的窗口,在默认情况下,创建图形对象的MATLAB函数把结果显示在当前图形窗口对象和轴对象上(图形对象是以轴对象的子对象为前提),用户也可以通过创建函数明确地指定其父对象属性,来使输出到用户需要的父对象中,例如下列代码。plot(1:10,Parent,axes_handle)以上代码中,用户指定了axes_handle为输出目标轴对象的句柄。另外,uicontrol和uimenu函数提供一种更加简便的调用格式,即第一个参数就是指定目标父对象的名称,例如下列代码。uicontrol(Figure_handle,.)uimenu(parent_menu_handle,.),14.6.2 定制图形输出的轴,默认情况下,图形绘制函数将输出的图形对象直接显示在当前的图形窗口中,而并不清除或重设图形窗口的属性。但是,如果图形对象是轴对象的子对象,MATLAB在显示图形对象之前,会将绝大多数的轴对象属性设置为其默认设置。用户可以通过改变图形窗口对象和轴对象的NextPlot属性来改变MATLAB的此种默认设置。在MATLAB 7.0中,高级绘图函数在绘制图形之前首先要检查NextPlot属性,然后决定是直接添加图形还是擦除重置图形窗口对象和轴对象;而低级对象创建函数则不检查NextPlot的属性,只是进行简单地添加图形的操作。,14.6.3 利用newPlot属性定制图形输出的重叠属性,MATLAB提供给用户newplot函数用以简化编写与NextPlot属性值设置保持一致的M-文件的过程。newplot函数首先检查NextPlot属性值设置情况,然后根据不同的情况采取相应的操作方法。所以,应该把newplot函数放置于任何调用图形对象构造函数的M-文件的起始位置。,14.7 M函数内句柄操作,图形的M-文件往往使用句柄来访问属性值,并通过句柄直接定义图形输出的目标。MATLAB 7.0提供给用户一些函数来获得图形关键对象(例如当前窗口和坐标轴)的句柄,然而在M文件中,使用这些函数并非优选的方法,原因是:MATLAB 7.0中将句柄直接存储在一个变量中比查询对象句柄或其他信息的执行效率高;当前轴对象、图形窗口对象或者其他对象可能因为用户的交互而产生变化,查询方式难以保证句柄的完全正确;相反,使用变量来存储句柄却可以保证正确地反映对象产生的变化。,14.8 小结,本章主要介绍MATLAB图形对象及相关的句柄操作,用户可以通过图形对象及其句柄更好地控制图形的显示,通过本章的学习,读者应熟练掌握以下的内容。MATLAB图形对象的概念及体系结构;对象句柄的概念及其操作;MATLAB对象属性的访问和设置;图形窗口对象和轴对象;图形输出控制。,