面向对象的图形系统的制作方法

文档序号:6408530阅读:144来源:国知局
专利名称:面向对象的图形系统的制作方法
技术领域
本发明一般涉及计算机系统中的改进,具体而言,涉及能够使用一个面向对象的操作系统的图形应用。版权通告本专利申请的某些部分中含有受版权保护的内容。版权所有者对出现在专利商标局的专利文件或者记录中的复制专利文档或者专利公开文件不予反对,但在其它情况下保留所有的版权。与本发明相关的背景技术在一个计算机屏幕上绘制计算机画面或图象称作计算机图形。计算机图形系统以数字形式内部存储图形。画面被分解成很小的画面元素或象素。从而,一个计算机画面或图形实际上是单个画面元素或象素的一个集合。在计算机的数字世界内部,各象素被赋予表示该象素的属性的一组数字值。例如,一个象素的属性可描述其色彩、亮度、与位置。从而,为了改变一个象素的色彩、亮度、或位置,只须改变该特定属性的数字值即可。
传统的计算机图形系统利用称作图象、位图、或象素图的图元把象素的集合表示为计算机成象。这些图元表示象素属性及它们的各自数字值的一个二维(2D)阵列。通常,这种图元是作为一个“结构”(数据结构)表示的,该结构中包含对象素数据的一个指针、一个象素大小、扫描行大小、界限、以及可能有对一张色彩表的引用。往往,采用象素来表示红、绿与兰(RGB)色彩、亮度、或对一张色彩表的索引。从而,图元承担作为一个帧缓冲器及作为一种帧存储说明的双重任务。
迅速成长中的计算机图形学工业已确定一种象素表示的事实上的标准。不符合这一标准的所有形式的图象都被强制成为二等公民。然而,传统的图形系统是不能扩展的。它们通常专用在一个特定图象类上操作的一个特定的应用。在当今快速改变的数字技术的环境中,这是不能接受的。每天都有新的应用产生,而且需要用它以新的方式来处理与操作新的图象类型。从而,采用一个具有不能扩充的图形说明的图形系统不仅是短视的,而且以一言以蔽之,是陈腐的。图形应用、属性、及计算机输出介质的组织要求是多种多样且不断扩展的。从而,专用的、单一目的的图形系统不能满足当前的应用需求。因此,需要一种增强的图形系统,它可以提供动态环境及能够扩展成包含新的应用、新的图象类型的可扩充的图形说明并提供新的象素操作。
例如,两个应用几乎不需要相同的象素属性集。三维(3D)应用存储Z值(深度排序),而动画与绘画系统存储字母值。交互式资料编辑程序与三维绘画程序存储三维消隐信息,而视频产生系统可能需要YUV4∶2∶2象素阵列。硬件限幅器存储层次标签,而复杂的系统可能存储对象ID供命中检测。再者,图形属性(例如色空间)是聚积常量相加,诸如PhotoYCCTM。彩色匹配技术仍在进化并且尚不清楚哪种量化彩色空间用于记录作为象素的可见光谱最好。从而,在图形世界中存在着各式各样的数据类型。同时存在着各式各样的存储器组织技术。更糟的是,好象每一种新的应用似乎都需要用于象素存储器的不同组织。例如,部件交错的(ComponetInterleaved)或“大块”的扫描线定向为Macintosh视频卡的主要组织,而部件交错的组合交换式存储器则是面向带有小地址空间的主机的视频卡的趋势。部件平片与部件交错片为预印刷与电子绘画应用中的趋势,但多次印刷或扫描的输出与输入设备则喜欢部件平面格式。多分辨率或金字塔格式常用于需要实时二次抽样的静态图象。再者,耗用大量存储器的图象可以表示成以多种方式编码的压缩象素数据。
图形应用、数据类型、与象素存储器管理的多样性与增长是非常大的。因此,需要一种能够处理所有已知应用并扩展成可以处理尚且未知的应用的多功能系统。单一的解决方法是不现实的。即使它可以处理每一种已知的要求,它也是庞大与难于控制的。然而,如果将这种应用缩小,它便不再能处理每一种应用。从而,需要一种适合许多用户的需求但允许单个用户定制的通用图型框架。本发明的目的及优点面向对象的系统很适合于解决传统的图形应用的缺点。面向对象的设计能提供一个通用的框架结构,该框架结构适合于许多用户的需求,但又允许单个用户裁剪与增加该通用框架结构来满足一组特定的要求。通常,一个对象的特征为若干操作及记住这些操作效果的一种状态。
因此,本发明的一个目的是提供一种简便的面向对象的图形系统的方法与装置。本发明的技术方案带有一个与之相连的显示器和存储器并具有面向对象的操作系统的处理器在该处理器的存储器中建立一个部件对象来管理图形处理。该处理器包含一个对象,用于将一个或多个图形设备连接到负责诸如图形加速器、帧缓冲器、页描述语言、及矢量机等各种对象上。该系统是完全可以扩展的,并包含建立在各支持对象中的多形态的处理。附图的简要说明

图1A为按照一个最佳实施例的个人计算机系统的方框图;图1B为按照一个最佳实施例的图形端口的分层配置;图2为按照一个最佳实施例的体系结构的方框图;图3示出按照一个最佳实施例的MGraphic的图形扩充的实例;图4示出按照一个最佳实施例的MGraphic及它们的对应几何图形;图5示出按照一个最佳实施例的图形系统的控制流的booch图;图6示出按照一个最佳实施例进行各种变换的一个星形图形对象;
图7描绘按照一个最佳实施例移动一个量的星形;图8示出按照一个最佳实施例围绕不同转动中心转动的星形;图9示出按照一个最佳实施例围绕不同的比例中心按比例描绘一个星形;图10示出按照一个最佳实施例用(-1.0,1.0)按比例描绘一个不对称星形的效果;图11示出按照一个最佳实施例的分层图形;图12示出按照一个最佳实施例的自行车图形;图13示出按照一个最佳实施例的螺母对象;图14示出按照一个最佳实施例的分层图形;图15示出按照一个最佳实施例存在于TPolygon的绘图调用内部的一个对象;图16示出支持两个或两个以上按照一个最佳实施例的图形的图形分层结构;以及图17为按照一个最佳实施例的详细逻辑的流程图。本发明的最佳实施例本发明最好实施在常驻在IBMPS/2或AppleMacintosh计算机等个人计算机上的操作系统中。图1中描绘了一种代表性的硬件环境,其中示出了按照本发明的一个工作站的典型硬件配置,包括诸如传统的微理器的一个中央处理单元10,及通过一条系统总线12互连的若干其它单元。图1中所示的工作站包括一个随机存取存储器(RAM)14、只读存储器(ROM)16、用于将诸如盘单元20等外部设备连接在总线上的一个I/O适配器18、用于将一个键盘24、一个鼠标器26、一个扬声器28、一个麦克风32与/或诸如触屏设备(未示出)等其它用户接口设备连接在总线上的一个用户接口适配器22、用于将该工作站连接到一个数据处理网络上的一个通信适配器34、以及用于将总线连接在一个显示设备38上的一个显示器适配器36。该工作站具有诸如Apple Sytem/7之类的操作系统。
在一个最佳实施例中,本发明是以C++编程语言用面向对象的编程技术实现的。如熟悉本技术的人员所能理解的,面向对象的编程(OOP)对象为包括数据结构与在这些数据上操作的软件实体。这些元素一起,按照由其数据元素表示的特征及由其数据操作功能表示的状态,使对象能够构成实际上任何现实世界实体的模型。以这一方式,对象能构成像人与计算机等有形事物的模型,也能构成像数字或几何概念等抽象概念的模型。对象技术的优点来自三个基本原理封装性、多形性、及继承性。
对象隐藏或封装了它们的数据及它们的功能据此进行工作的算法的内部结构。代之以暴露这些实现的细节,对象表示接口,而接口则简洁地代表它们的抽象而不带附加的信息。多形性在封闭性上前进了一步。这一概念是许多形状、一个接口。一个软件部件能请求另一个部件而无须实际知道该部件是什么。接受该请求的部件对其进行解释并根据其变量与数据确定如何执行该请求。第三个原理是继承性,它允许开发人员重复使用事先存在的设计与代码。这一能力使开发人员能够避免从草稿开始建立软件。说的更确切些,通过继承性,开发人员可导出继承行为的子类,然后开发人员将其裁剪以满足他们的特定需求。
一种先有技术的方法是在一个过程环境中将对象与类型库分层。上市的许多应用框架结构采用这一设计方法。在这一设计中,在一个单片操作系统上有一个或多个对象层。虽然该方法在对象层中利用了所有的封装性、多形性、与继承性原理,并且是对过程编程技术的一种显著的改进,但在这一方法中存在着限制。这些困难产生于下述事实,即虽然开发者容易重复使用他们自己对象,但难于使用来自其它系统的对象,而开发者仍须用过程操作系统(OS)调用来到达较低的非对象层。
面向对象的编程的另一方面为对应用开发的框架结构方法。框架结构的最合理的定义之一来自Illinois大学的Ralph E.Johnson与Purdue的Vincent F.Russos。在他们的1991年的论文“重复使用面向对象的设计”(Illinois大学技术报告UIUCDCS91-1696)中,他们提出了下述定义“一个抽象类是合作实现一组职责的一组对象的设计。从而,一个框架结构是合作执行定义的计算职责组的一组对象类”。从编程的立场,框架结构主要是提供一个工作应用的预制结构的互相连接的对象类的群。例如,一个用户接口框架结构可以提供绘制视窗、卷动条、菜单等的支持与“系统预置”的行为。由于框架结构是基于对象技术的,这一行为能够进行继承与置换以允许开发者在一个特定专业领域内扩展该框架结构及建立经过裁剪的解决方法。这与传统的编程相比是一大优点,因为程序员不改变原来的代码而只是扩展软件。此外,开发者并不盲目地通过代码层工作,因为框架结构提供结构指导与模型构成,但同时他们能够自由地根据特定的问题区域来支持特定的操作。
从商业角度来说,框架结构可以被看作是一种封装或实现特殊领域的专业知识的方法。合作开发组织、独立软件销售商和系统集成人员已经获得了特殊领域的专业知识,例如生产、结帐或者货币交易。这些专业知识通过它们的代码得以实现。框架结构使得各个组织能够收集和封装专业知识的常规属性,方法是通过在该组织的代码中实现它们。首先,这允许开发人员利用专业知识创建或扩展一个应用程序,这样问题就得到了一次性的解决,而且前后一致地实施了商业原则和设计。体系和其所实现的专业知识对于那些已经获得了生产、结帐或者生物技术等市场的专业知识的组织来说,同样具有至关重要的意义,在这些市场中,存在有包装、销售和使用专业知识乃至进一步的技术进步和推广等的分配机制。历史上,框架结构只是最近才作为一种主流概念出现在个人计算平台上的。这一转移是在诸如C++之类的面向对象的语言的协助下实现的。传统上,C++语言大多数出现在UNIX系统与研究工作者的工作站上,而不是在商业机构的计算机上。正是C++及诸如Smalltalk等其它面向对象的语言使得若干大学与科研项目成为今天的商业框架结构与类库的先驱。它们中的一些实例包括Stanford大学的Interviews、Carnegie-Mellon大学的Andrew工具箱、及Surich大学的ET++框架结构等。框架结构的类型从协助开发用户接口的应用框架结构到提供诸如通信、打印、文件系统支持、图形等基本系统软件服务的低级框架结构。应用框架结构的商用实例有MacApp(Apple)、Bedrock(Sqmantec)、OWL(Borland)、NeXTStep AppKit(Next)及Smalltalk-80MVC(Parcplace)。
对于习惯于其它种类的系统的开发者,用框架结构编程需要新的思维方式。事实上,它完全不同于传统意义上的“编程”。在诸如DOS或UNIX等老式操作系统中,开发者本人的程序提供所有结构。操作系统通过系统调用提供服务,开发者的程序在它需要服务时作出调用并在已提供了服务时控制返回。程序结构是基于控制流的,它是体现在开发者所编写的代码中的。在使用框架结构时,这是倒过来的。开发者不再负责控制流。开发者必须放弃用执行流程来理解编程任务这一趋势。而是,思维必须用对象的任务来表示,它必须依赖框架结构来决定何时应执行这些任务。开发者所编写的例程是由开发者并未编写甚至从未见过的代码激活的。控制流中的这一颠倒能成为只有过程式编程经验的开发者的一大心理障碍。但是,一旦明白了这一点,框架结构编程比其它类型的编程需要少得多的工作量。
以一个应用框架结构向开发者提供预制的功能性相同的方式,系统框架结构(诸如包含在一个最佳实施例中的)通过提供系统级服务达到相同的概念,诸如系统程序员等开发者便是利用些系统级服务来再细分类/置换以建立定制的解决方法。例如,考虑一个多媒体框架结构,它能提供用于支持诸如音频、视频、MIDI、动画等新的与多种多样的设备的基础。需要支持一种新的设备的开发者必须编写一个设备驱动程序。使用框架结构的开发者只须提供该新设备所特有的特征与行为即可。
在这一情况下,开发者提供多媒体框架结构将要调用的某些部分功能的实现。对开发者的直接效益是各类设备所需的通用代码已经由该多媒体框架结构提供。这意味着开发者编写、测试与调试较少的设备驱动程序代码。采用系统框架结构的另一个实例为对于SCSI设备、Nu Bus卡与图形设备具有独立的I/O框架结构。因为存在着继承的功能性,各框架结构提供其设备类型中存在的公共功能性的支持。其它开发者便能依靠这些一致的接口来实现其它种类的设备。
一个最佳实施例采用框架结构的概念并将其贯穿于整个系统应用中。对于商业或合作开发者、系统集成人员或OEM,这意味着诸如Mac App等框架结构所显示的所有优点不仅都能在诸如文本与用户接口等事物的应用级上达到,也能在诸如图形、多媒体、文件系统、I/O、测试等服务的系统级上达到。在一个最佳实施例的体系结构中的应用建立主要象缩写遵守框架结构协议的域特有的部分。
以这一方法,改变了整个编程概念。不是编写一行一行调用多个API的层次的代码,而是通过从这一环境内预先存在的框架结构中导出类,然后根据需要加上新的行为与/或置换继承的表现。从而,开发者的应用成为由所有其他框架结构应用所编写并且与所有其它框架结构共用的代码的集合。由于开发者能够在互相的工作上进行建立,这是一种强有力的概念。这同时向开发者提供要多少裁剪多少的灵活性。某些框架结构则原封不动地使用。在有些情况中,裁剪量是非常小的,因此开发者插入的部分是很小的。在其它情况中,开发者可能进行非常广泛的修改而建立全新的事物。
在图1中所示的一个最佳实施例中,一个多媒体数据路由确定系统管理多媒体信息通过计算机系统的运动,而位于CPU10控制下的RAM14中的多个媒体部件,或者通过总线12或通信适配器34外部连接的多媒体部件则负责提供多媒体信息。无须中央播放器来协调或管理系统的整体处理。这种体系结构提供灵活性并在增加新的媒体类型时提供增加的可扩展性。一个最佳实施例提供一个面向对象的图形系统。该面向对象的操作系统包括若干被清楚地划分成系统的部分或功能的对象。每个对象包含关于其本身的信息及能在其信息或传递给它的信息上完成的操作。例如,有一个称作WOMEN的对象。包含在对象WOMEN中的信息或其属性可以是年龄、地址、与职业。这些属性描述对象WOMEN。该对象还包含能在其所包含的信息上完成的一组操作。从而,WOMEN可以完成把医生改变到律师的职业改变操作。
对象通过互相发送报文来交互作用。这些报文激励接收对象采取某种行动。即执行一个或多个操作。在本发明中存在许多通讯的对象。某些对象具有共同的特征而组合成一个类。类是建立与同一类中其它成员包含相同的信息与操作的新对象的样板。从一定的类中建立的对象称作该类的一个事例。类定义起始包含在一个事例中的操作和信息,而该事例的当前状态是由在该事例上执行的操作定义的。因此,虽然一个给定类的所有事例都是同样建立的,但随后的操作能使各事例成为一个唯一的对象。
多形性是指面向对象的处理中激励或报文的发送者不需要知道接收的事例的类。发送者只须知道接收者能执行某种操作,而与对象执行的操作或者它属于什么类无关。事例继承它们的类的属性。从而,通过修改双亲类的属性,同时修改了各种事例的属性,并且子类继承这些改变。可以通过叙述已存在的类的修改而建立新类。新类继承其类的属性,并且用户能增加该新类所独有的任何事物。从而,只须说明新类或对象与其双亲类或对象如何不同便能定义一个类。落在继承层次结构中另一类下面的类称作双亲类的子代或子女,它们是从双亲类中导出与继承的。在多形环境中,接收对象在收到激励报文时负责确定要执行何种操作。操作是可以作用在一类中的对象上或者由其作用的功能或变换。激励对象无需知道接收对象,这便简化了操作的执行。各对象只须知道如何执行其本身的操作,以及为执行一个特定对象所不能执行的那些操作进行适当的调用。
当相同的操作可以作用在许多不同的类上时,它便是多形性操作。相同的操作在各种不同的类中采取不同的形式。一种方法便是为一个给定的类实现一种特定的操作。例如,类“Document”可以包含一个称为“Read”的操作。取决于文献的数据类型,例如ASCII或BINARY(二进制),可采用不同的方法来执行“Read”操作。如此,虽然两种方法均可逻辑地执行相同的任务“Read”,并且是用同一个名“Read”调用的,事实上它们可以是由不同的可执行代码部分实现的不同方法。虽然操作“Read”可具有若干类中的方法,但它保持相同数目和类型的变量,即其标记保持不变。子类允许用户裁剪通用框架结构。它允许不同的量化折衷、象素属性组、及不同的象素存储器组织。各子类能封装如何分配、管理、流送、翻译、与修改其本身的象素数据类的知识。一个最佳实施例的所有子系统都采用多形性存取机制,它使用户能够扩展能复制或拷贝的缓冲器类型。
在各种类型的缓冲器中存在着某种共性。如所知的,存在着八种必要的基本功能或类别来满足大多数客户的需要。大多数客户需要多形管理及指定离散与连续空间之间的关系的能力。客户需要说明色彩特征的能力,以供进行精确的彩色再现。客户需要“Get”与“SetPixel”、裁剪成用于扫描变换中的客户的专用的“blitloops”、BitBlt、及“CopyImage”这类方式的象素存储器改变机制。客户需要向客户提供与一个关键字匹配的变量的机制,该关键字是从客户提供的属性的组合构成的。客户希望可以有针对特征或存储的属性执行多形性查询的能力。客户需要允许他们能多形地建立、维护、与查询高速缓冲存储器的机制。最后,客户需要允许他们多形地建立与维护互相关联的后备缓冲器的机制。
图形应用编程接口(API)图形系统的基本部件包含一组固定的几何元素二维中的点、矩形、线、曲线、多边形、折线(polyline)、面积,三维中的线、折线、曲线与表面。这组几何图形不是用户可以扩充的。这便限制了低级图形设备的复杂性,并提供了使用户级API与低级设备之间的数据一致的“合同”。
离散化的数据集其中包含带有若干可能部件的二维光栅图象及组成三角形的三维数据集。
高级建模工具能表示图形对象的分层结构群。
变换这些对象表示用传统的3×3(二维中)或4×4(三维中)矩阵来旋转、放大缩小、平移等对象所能得到的操作。
束这些对象封装几何图形的外观。标准属性包括(二维与三维)帧与/或填色、笔划粗细、阴影线图案等。在三维中,束还定义消隐属性。可通过关键字/值对指定定制的属性。所有的数字值都是以图形系统中的IEEE标准双精度浮点数表示的。
图形端口一个图形端口是封装应用的状态的一个应用级视图。图形端口将任何绘图调用的路由重定到若干可能的设备(监视器、画面外帧缓冲器、网络上的PostScript打印机,视窗等)中适当的一个上。图形“状态”(当前变换、束、剪辑区等)是在端口级上管理的。然而,在设备级上,系统是“无状态的”。换言之,一个特定的再现操作的整个状态是在该再现发生时向该设备表示的。注意,设备可能转向并调用其它设备。例如,用在整个桌面上的设备可能首先确定该几何图形落在哪一个屏幕上,然后调用该特定屏幕的再现调用。
体系结构简介在过去的图形体系结构中,图形通常私用地存储其状态(诸如彩色、传输模式、剪辑区等)。当要求绘图时,该图形以过程方式将这些状态变量复制到一个图形端口中,在那里它们受到再现代码的访问。从而,图形的状态只在这一明显的绘画操作中才能得到。这不是面向对象的,并且是现代图形系统不能做到的一种限制。一个最佳实施例提供使图形存储其状态的框架结构。该框架结构支持“不要调用我们,我们调用你”的体系结构,其中,客户能在任何特定功能的上下文外面对图形状态访问。这便是图形端口类的目的。它是定义用于访问状态变量的接口的一个抽象类。实际子类定义状态变量的实际存储与连接行为。
图形端口类采用图形端口类的设计将图形状态组合成四个不同的组,然后再将它们组合成称作图形端口的一个单一的类。四个“子状态”为TGrafBundle、TCoordinateSystem、TClipBoundary与TSceneBundle。一个图形端口对象能被需要访问整个图形状态的其它类引用。此外,可将子女图形状态连接在其双亲的图形端口对象上产生一个新的图形端口对象。图1B为按照一个最佳实施例的图形端口的分层配置。图形端口类还包含访问设备与设备高速缓冲存储器的方法。GetDevice返回一个指向设备的指针,再现便是在该设备中完成的。通常,该设备是从双亲图形端口继承的。GetCache返回一个对高速缓冲存储器的指针,设备使用该高速缓冲存储器来高速缓存设备相关的对象。这一高速缓冲存储器必须是设备早先建立的。再细分类图形端口与四种子状态的主要目的为定义如何进行图形状态、设备、与设备高速缓冲存储器的连接和存储。状态变量的较简单的平淡组不足于灵活地支持对状态变量的子集的状态连接的裁剪。同时,子状态协助将状态变量分成公共组。例如,一个简单的图形通常只需TGrafBundle;较复杂的图形对象可能需要一个矩阵并可能需要一个剪辑区。
诸如MGraphic之类的图形类必须利用基本几何图形组将自己描述给TGrafPortDevice,而各几何图形必须具有与几何图形相关联的一个图形端口对象。图形端口允许图形对象方便地将其内容“转储”到TGrafDevice对象中。这是通过在图形端口类中提供一组绘图功能而完成的,该组绘图功能镜象TGrafDevice类中的一组再现功能。各绘图功能采用一个几何图形并将该几何图形与所包含的图形状态传递给设备中的适当的再现调用。为了方便起见,同时传递一个置换束及模型矩阵。
图2为按照一个最佳实施例的体系统结构的方框图。在该最佳实施例中,建模层200利用上述API210生成对图形端口210的调用。该图形端口(GraphPort)接口只接受构成用户级API与设备级API240之间的“合同”250的特定固定元素组。图形端口捕捉包含变换、外观(“束”)的状态信息,并剪辑进可用于多种类型设备的多形性高速缓冲存储器220中。对于各次再现调用,将几何图形与所有相关的累积状态信息230通过多形性对象240表示给设备。由图形设备对象240管理的设备可采用的形式包括页面描述语言260(诸如PostScript)、矢量绘图仪270、具有用来再现几何元素的常规电子硬件的设备280、传统的帧缓冲器290、或诸如显示器、打印机、或绘图仪等的任何其它图形设备。
建模层在图形端口与几何层上有一个供选用的建模层。一个最佳实施例提供建模层,但应用能置换该系统预置。系统预置的建模层称作“MGraphic”层。MGraphic对象封装几何图形与外观两者(一束)。为了再现MGraphic,使用一种绘图方法。该方法将画入MGraphic的图形端口当作一个变元。MGraphic绘图法将这一信息变成一个图形端口调用。将MGraphic层与图形端口/几何层分开的目的是为了避免只适用于一种数据库的固定结构。如果MGraphic对象所提供的结构不满足客户的要求,体系结构仍允许使用不同的数据结构,只要它能用原始几何图形、束、与变换进行表示即可。
MGraphic层图形系统提供在设备上再现几何图形的两种不同的方法。应用能直接将几何图形绘制到设备上。图形端口类支持良好定义的但固定的一组二维几何图形。它用一组超负荷的绘图方法来支持它们。当采用这一方法时,属性与变换矩阵并不与几何图形相关联,使之只适合于直接模式再现。下列伪代码是应用如何使用这一方法建立一条红线的实例。
P12L36-P13L3程序另一方面,应用能通过称作MGraphic的一个较高级抽象绘制几何图形。这是描绘基本图形的保留模式方法。MGraphic为用来表示图形系统的二维图元的一个抽象基础类。它是能够保持在一个集合中并变换与绘制到图形设备(TGrafDevice)的图形对象的一种高级表现形式。各MGraphic对象保持一组其本身的属性并提供流送能力(在其某些子类上有所限制)。命中测试方法提供诸如采集之类的MGraphic对象的直接操作机制。MGraphic通过再细分子类提供可扩充性,这是MGraphic的关键特征之一。MGraphic的一个特定子类也建立MGraphic对象的分层结构并提供扩充图象系统的能力。图3示出按照一个最佳实施例的MGraphic的图形扩充的某些实例。
MGraphic为应用保持几何图形相关数据的实用类,这些数据中包含几何定义、图形束(grafbundle定义几何图形的表示的图形属性组)、及一组变换方法。MGraphic对象还保持用户所需的任何其它信息并复制与流送这一用户特定的数据到一个应用。对于从事纯直接模式再现的应用可能不需要这一类。对于直接模式的图元再现,应用通过将一个适当的几何对象、一个图形束、及一个变换矩阵传递给图形端口而再现该几何图形。图4示出按照一个最佳实施例的若干MGraphic及它们的对应几何图形。图5为按照一个最佳实施例的图形系统的控制流的Booch图。在图5的Booch图中,用点划线描绘的“云彩”表示类或类的群集(诸如应用500)。连接类的箭头是从子类指向上级类的,并表示包含封装性、继承性、与多形性性质的分层结构,正如通常对象技术及该技术中所采用的表示它们的图形标记。双线指出实现或接口中使用的类。线段的一个端点上的园表示在线段端点上带有园的类的包容或使用。对于这一标记的更完整的描述,可参见Benjamin/Cummings出版公司出版的,Grady Booch所著的“面向对象的设计”一书,版权所有,1991。当前的Mgraphic520继承自Mdrawable510,后者又继承自Mcollectible500,以继承Mcollectible500的流送、版本、与其它行为。各Mgraphic520也有一个束TGrafBundle530,它保持一组属性。这些属性是MGraphic在再现时使用的。
MGraphic抽象基础类只表示二维图元。通常认为二维与三维图元不属于公共的集合,除非用户清除了二维图元所在的三维平面。二维与三维图元具有不同的坐标系统,混合它们会迷惑用户。客户可根据他们的特定应用要求混合这两个集合。类Mdrawable510为Mgraphic520与MGraphic3D两类所公用的抽象基础类,它抽象于这两类的公共绘图行为。只对绘图方法有兴趣的客户而言,这一类才有用处,并且这一类在二维与三维两者中都不需要超负荷的功能。
MDrawable绘图协议所有MGraphic(二维与三维)都在图形端口上绘图,图形端口作为一个参数传递给MGraphic。除了状态信息是由GrafPort封装的以外,其它信息都包含在MGraphic对象中。这一信息中包含几何图形、属性束、与任何变换信息。所有MGraphic都同步绘图,并不处理更新或动画需求。建立子类是客户的事。当作为诸如一张MDrawable对象的表的一个集合绘制二维与三维图元时,绘图的序列是与在图形端口上作出二维与三维调用的序列相同的。从而,取决于再现它们的次序,画一个二维多边形、一个三维盒子、及一个二维椭园将是不同地再现的。传递给这一方法的图形端口是一个被动的迭代器,它被接受传递的MGraphic所作用。
MGraphic变换图6示出按照一个最佳实施例进行各种变换的一个星形。变换能通过放大、缩小、或透视变换改变MGraphic的形状,并通过旋转与移动改变其位置。变换方法允许应用改变已存在的MGraphic的形状与位置,而无须重建该MGraphic。所有变换方法都只对MGraphic施加相对变换。方法ScaleBy、MoveBy、与RotateBy为更通用的方法TransformBy的特例。子类直接将变换施加在它们要直接改变的几何图形上。
所有MGraphic子类对任意变换都是封闭的,即一个TGPolygon在受到任意变换的变换时仍然是一个TGPolygon。然而,某些几何图形并不具有这一封闭性质。例如,一个矩形在受到一个透视矩阵的变换时不再是一个矩形并且宽度与高度均无定义。原来的矩形说明不足以描述该矩形的变换形式。所有MGraphic子类必须对任意变换封闭。由于所有变换都是相对的,一个变换的MGraphic不能通过传递一个单位矩阵给MGraphic方法TransformBy()而“不变换”。
图7描绘按照一个最佳实施例移动了一个量的星形。这一方法将MGraphic相对于其当前位置移动一个量。图8示出按照一个最佳实施例绕各种转动中心旋转星形。旋转的量是用度指定的并且永远是顺时针的。但是子类能置换系统预置并优化特定的几何图形与用途。图9示出按照一个最佳实施例绕不同的定标中心放大缩小一个星形。因子是允许在X与Y方向上不均匀地放大缩小的一个矢量。图9中的参数量的X坐标为(新X/旧X)而Y坐标为(新Y/旧Y)。在均匀放大缩小的情况中,X与Y坐标两者是相同的。图9还示出绕不同定标中心的放大缩小。
负定标因子是允许的,而负定标因子的效果是镜象相同的。在X方向上定标-1.0与绕Y轴的镜象相同,而在Y方向上的一个负的定标因子与绕X轴的镜象相同。图10示出按照一个最佳实施例用(-1.0,1.0)定标一个不对称星形的效果。和RotateBy()与TranslateBy()相似,这一变换的效果与建立一个定标矩阵并将其传递给TransformBy()相同,并且这是系统预置的实现。子类能置换这一系统预置的实现并优化一个特定的几何图形与用途。Transform By是用矩阵变换MGraphic的一个纯虚拟的成员函数。MGraphic的所有实际子类都必须定义这一成员函数。为了得到适当的效果,拥有用于操作的TGrafMatrix的子类必须用本身的矩阵右乘参数矩阵。
MGraphic属性束如图5中所见,所有MGraphic对象都具有一个相关的属性束TGrafBundle。该束为图形对象保持诸如色彩、笔、填充或成帧之类的属性信息。在建立MGraphic时,根据系统预置,将GrafBundle对象设定为空。如果GrafBundle等于空,则由系统预置的机制再现几何图形。用在一个分层结构中时,在再现子女之前必须将双亲束与子女束连接起来。如果子女的束为空,则子女用双亲的束来再现。例如,在图12的分层结构中,在再现对象E之前,它将继承A、C、与E的属性,并且A中属性的改变将向下传给它所有的子代,即B、C、D、E、G、与D。
注意到一束具有与之相关联的大量信息是很重要的。从而,通常避免束的复制。一旦采纳了束,MGraphic对象将负责在MGraphic对象被破坏时适当地破坏该束。当一位客户想要修改一个MGraphic对象的一种属性时,他们通过孤立该束,改变其属性,然后令MGraphic采纳该束来做到这一点。同时,在采纳或孤立该束时,必须使依存于束的所有高速缓冲存储器都失效。当一个对象孤立数据时,它返回一个指针给数据并不再负责该数据的数据管理。当一个对象采纳数据时,它取入指向存储器的指针,并对该存储器承担全部责任。已经在MGraphic基础类中提供了所有与束相关的成员函数的系统预置实现,子类无须置换这一功能,除非该子类具有一个基于属性的高速缓冲存储器,并且每当采纳与孤立该束时需要更新该高速缓冲存储器或使之失效。例如,如果高速缓存了松配合联接,则在属性改变时必须使之失效(或重新评估)。
用于束管理的C++应用程序接口(API)·Virtul void Adopt Bundle(TGrafBundle*bundle)MGraphic采纳该束。
如果一个MGraphic已保持一个束便删除它,并将该新束附着在其上。由于传递的是指针,重要的是客户不需要保持对作为参数传递的束的引用。MGraphic对象在遭到破坏时将删除该束。·Virtual const TGrafBundle*GetBundle()Const这一方法允许用户查询一个束,然后通过重复地通过其属性而查询它们。这一方法提供对存储在该MGraphic对象中的束的一个替换入口。·Virtual TGrafBundle*OrphanBundle()这一方法把一个束返回给一个调用应用供其使用。一旦调用了这一方法,调用应用便负责删除该束,除非它再次被一个MGraphic对象所采纳。孤立时,将该MGraphic束设定为空,并且在随后绘制该图形时,MGraphic使用其双亲束的属性/束的系统预置机制。这种MGraphic子类引用其它MGraphic对象。虽然复杂MGraphic对象的所有操作的行为类似于一个MGraphic对象,但这些对象并不完全封装它们所参照的MGraphic对象。在一个最佳实施例所支持的那些子类中,落入这一范围内的一个便是TGraphicGroup。TGraphicGroup衍生于抽象基础类TBaseGraphicGroup,后者使建立横贯群集的迭代器的方法可以多形地利用。为了使迭代器可以多形地利用,重要的是客户建立群集或分层结构以便从基础类TBaseGraphicGroup中衍生。图11示出按照一个最佳实施例的类分层结构。
TBaseGraphicGroup迭代器支持由于GraphicGroup简化了分层结构的建立,用于迭代分层结构的支持是内装在这一基础类中并且是可以多形地利用的。这一方法在抽象基础类TBa seGraphicGroup中是虚拟的,而所有子类都提供一种实现。希望掩蔽它们的子女的子类在调用这一成员函数时可能返回一个空的迭代器。协议TGraphicIterator*CreateGraphicIterator()const=0这一方法建立一个通过分层结构的第一级迭代的图形迭代器。例如在图1 2中,图形迭代器建立一个在B、C、与F上迭代的实际子类。为了进一步向前迭代,必须为B与C两者建立迭代器,因为它们是TBaseGraphicGroup。建立分层结构的所有子类都必须提供实际的实现。
TGraphicIterator是一便于在TBa seGraphicGroup的子女上迭代的有效迭代器。TGraphicIterator方法包括·Const MGraphic*TGraphicIterator∷First()·Const MGraphic*TGraphicIterator∷Next()·Const MGraphic*TGraphicIterator∷Last()TGraphic Group图形系统提供TBaseGraphicGroup的一个实际子类TGraphicGroup,它支持树的建立。TGraphicGroup建立构成一个群集的MGraphic对象的集合。由于各MGraphic对象可以是一个TGraphicGroup,所以客户可以建立一个对象的分层结构。图12是由TGraphicGroup所建立的分层结构的实例。图12包含TGraphi cGroup A、B、与C。D、E、F、与G为封装一个以上几何图形的不同的简单MGraphic。A能引用B、C、与F。B参照D而C参照G。群集C也参照MGraphic E。图12可认为是一辆极为简化的自行车,其中A参照MGraphic F,自行车身,而参照变换的群集B与C则分别与后轮及前轮相关联。两个轮子是由图元几何图形D与G表示的。E表示自行车的把。移动节点C将移动前轮与把,而移动节点A将移动整个自行车。
当再现时,把一个变换矩阵应用到子女上时,该群集便建立一个暂时GrafPort对象并将其矩阵与存储在GrafPort中的矩阵连接。新的GrafPort用于再现其子女,一旦完全再现了该子女后便被破坏。GrafPort对象是建立在栈上的。TGraphicGroup不允许其子女具有一个以上的双亲。TGraphicGroup直接从MGraphic继承,从而各节点拥有其自己图形束并能影响分层结构中自己的一侧。TGraphicGroup的破坏程序破坏自身但不破坏其子女。应用负责跟踪引用并在不引用时破坏MGraphic对象。
Graphi cGroup迭代器GraphicGroup提供迭代其子女的实际实现。所建立的图形迭代器只迭代一级。关注深度超过一级迭代的客户可通过在后面的TGraphicGroup上建立迭代器而完成其目的。
属性与变换分层结构各TGraphicGroup如果选择这样做,则定义其自身的属性与变换。根据系统设预置,一个属性束是空的,并将变换矩阵设定为单位矩阵。由于TGraphicGroup是一复合的MGraphic,它能引用其它MGraphic及其子女。根据定义,各子女必须继承其双亲的属性特征与变换。然而,由于各子女可包含多个引用,它在再现时通过连接双亲的信息而继承这些属性,但并不改变其本身的属性。这些属性的连接是在绘图(Draw)调用时完成的。将属性与矩阵两者都与作为参数传递给Draw调用的TGrafPort对象连接。在图12中,对象A(自行车身)的属性与变换与传递给A的GrafPort对象(作为对成员函数Draw的参数)连接,并在栈上建立一个新的GrafPort对象APortObject。将APortObject传递给与其状态连接的对象C并生成一个新的端口对象CPortObject。将新的CPortObject传递给对象E去再现。对象E将其状态与CportObject连接并用新状态再现自己。
MGraphic实例作为一个实例,从MGraphic再细分类出一个图形以建立一个对应于螺母的顶视图的特殊二维图元。这一类存储用于本地坐标系统的一个变换矩阵,并且是不考虑性能与效率的一个非常简单的实例。图13示出按照一个最佳实施例的螺母对象。下面的代码是按照一个最佳实施例完全定义该螺母对象的C++原程序清单。
<pre listing-type="program-listing"><![CDATA[class TBoltToppublic MGraphic{publicTBoltTop(GCoord BoltDiameter,GCoord outerRadius,TGPoint center);TBoltTop(const TBoltTop&amp;);TBoltTop&amp;operator=(const TBoltTop&amp;);virtual void Draw(TGrafPort&amp;)const;virtual TGPoint GetAlignmentBasePoint()const;virtual TGRect GetLooseFitBounds()const;virtual TGRect GetGeometricBounds()const;virtual void TransformBy(const TGrafMatrix&amp;matrix);virtual Boolean Find(TGrafSearcher&amp;searcher)const;privateTBoltTop();∥For streaming purposes only.TGrafMatrix fMatrix;TGPolygon fPolygon;∥This isthe outer polygonTGEllipsefCircle; ∥This isthe inner circlevoid ComputePolygon(GCoord outerRad,int numOfSides);};TBoltTop∷TBoltTop(){}TBoltTop∷TBoltTop(GCoord boltDia,GCoord outerDia,TGPoint center) fCircle(boltDia,center){ ∥calculate the hexagon polygon from these paramters ∥The side of the polygon=outerDiameter/2.0 TGPointArray polygonPoints(6); TGPoint tmpPoint; for(unsigned long i=0,theta=0.0;i<6;i++,theta+=kPi/6){tmpPoint.fX=center.fX+outerDia * sin(theta);tmpPoint.fY=center.fY+outerDia * cos(theta);polygonPoints. SetPoint(i,tmpPoint); }}void TBoltTop∷Draw(TGrafPort &amp;port)const{ /* *draw the geometry with the GrafBundle and the matris *associated with this primitive */ port.Draw(fPolygon,fGrafBundle,fMatrix); port.Draw(fCircle,fGrafBundle,fMatrix); /* *If there are a large number of primitives with same attributes *it is efficient to construct a local port and then render *geometries into this local port. *The semantics will be as * *TConcatenatedGrafPort newPort(port,fGrafBundle,fMatrix); *TConcatenatedGrafport is a port that concatenates bundle and*matrix with the state information of the old port. * *newPort.Draw(fPolygon); *newPort.Draw(fCircle); */}TGPoint TBoltTop∷GetAlignmentBasePoint()const{ ∥The alignment point is the center of the circle. TGPoint point; point.x=fCircle.GetCenterX(); point.y=fCircle.GetCenterY(); return point;}TGRect TBoltTop∷GetLooseFitBounds()const{ TGRect bounds; ∥Get bounds of the polygon ∥pass the bounds to the bundle for altering. GetGeometricBounds(bounds); fGrafBundle->AlterBounds(bounds); return bounds;}TGRect TBoltTop∷GetGeometricBounds()const{ ∥Get bounds of the polygon ∥pass the bounds to the bundle for altering. bounds=fPolygon. GetBounds();}void TBoltTop∷TransformBy(const TGrafMatrix&amp; matrix){ fMatrix.ConcatWith(matrix);}void TGrafSearch∷EFindResult TBoltTop∷Find(TGrafSearch&amp; search)const{ if(!search.find(fPolygon,fGraf3undle,fMatrix)){return search.find(fCircle,fGrafBundle,fMatrix); } return TGrafSearch∷kDoneSearching;}]]></pre>设备高速缓冲存储器设备高速缓冲存储器可以是一个潜在的大对象,所以必须小心保证设备高速缓冲存储器不会在整个系统中无限制地迅速增大。如果将同一基础GrafPort用于若干层次,这些层次便自动共享基础GrafPort中的高速缓冲存储器。
图形状态连接图14示出按照一个最佳实施例的分层图形。该图形包含一个群集中的一个多边形及一个椭园。分层结构中的各图形能存储一个图形状态。例如,多边形与椭园各有一TGrafBundle,而TGroup则不存储图形状态。在考虑矩阵的分层状态之前这一体系结构是容易理解的。为了产生正确的几何矩阵,必须将一个图形的本地视图矩阵与其双新的视图矩阵连接,然后由图形将连接的矩阵高速缓存起来。必须将图形的状态“连接”到其双亲图形的状态上,以产生新的作用在该图形上的整组状态。在调用TGroup∷Draw时,传递进其双亲的图形端口对象。由于TGroup没有其本身的状态,它并不执行任何连接。它只将其双亲的图形端口对象传递给多边形的Draw调用,然后传递给椭园的Draw调用。
多边形具有一个必须连接到其双亲的图形端口对象上的TGrafBundle对象。这是通过建立一个能执行这一连接的本地图形端口子类提供的。然后它作出对TBundleConcatenator∷Draw的调用。图15示出按照一个最佳实施例存在于TPolygon的Draw调用内部的一个对象。因为TBundleConcatenator对象是对TPolygon的Draw调用局部建立的,这种连接本质上是瞬态的。对于特定类型的图形层次需要这一处理。例如,允许两个或两个以上其它图形共用一个特定图形的图形分层结构必须实现瞬态连接,因为共用的图形具有多个双亲。图16示出按照一个最佳实施例的支持两个或以上图形共用的图形分层结构。这一实例中的曲线对象是图形B与C共用的。从而,连接必须是瞬态的,因为连接结果随所取的支路(B或C)而不同。
持久的分层结构中的图形对象需要双亲的信息的知识,从而使一个图形能用其双亲的状态画出而不用画出其双亲。分层结构中的图形不能由多个双亲共用。诸如不带参数的ConcatenateWithParent调用及Draw调用等附加语义必须加在分层结构中所使用的图形类上。一个图形可使用存储诸如坐标系统与剪辑边界等更多状态的图形端口子类。从而各图形也可能要保持其自己私用的设备高速缓冲存储器。
图17为按照一个最佳实施例的详细逻辑的流程图。处理在功能框1700上开始,其中图形端口对象1740将一个建模层对象分解成一组固定的几何图形对象1730及一组可扩充的图形属性对象1720。图形端口对象1740将几何图形对象1730与图形属性1720传递给多形图形设备对象1750,后者管理诸如页面描述语言对象1760、矢量机1770、图形加速器对象1780、帧缓冲器对象1740等设备(硬件与软件),或诸如图1中所描绘的显示器、打印机、或绘图机等较传统的图形设备。
权利要求
1.一种面向对象的系统,包括(a)一个处理器;(b)在所述处理器控制下并与之相连的一个存储器;(c)在所述处理器控制下并与之相连的一个或多个图形设备;(d)在所述处理器的存储器中的一个图形端口对象;(e)在所述处理器的存储器中的一个图形设备对象,用于管理所述的一个或多个图形设备中的一个图形设备;(f)在所述处理器的存储器中的一个图形对象,用于管理图形处理;以及(g)在所述的图形对象的控制下将所述的图形设备对象连接到所述的图形端口对象上以便在所述的一个或多个图形设备之一上输出图形信息的装置。
2.根据权利要求1所述的一种系统,还包括一个图形加速器图形设备对象。
3.根据权利要求1所述的一种系统,还包括一个帧缓冲器图形设备对象。
4.根据权利要求1所述的一种系统,还包括一个页面描述语言图形设备对象。
5.根据权利要求1所述的一种系统,还包括一个矢量机图形设备对象。
6.根据权利要求1所述的一种系统,其中所述的图形端口对象、图形设备对象、与图形对象是多形性的。
7.根据权利要求1所述的一种系统,其中所述的图形端口对象、图形设备对象、与图形对象是完全可扩充的。
8.根据权利要求1所述的一种系统,还包括图形对象中的一个建模层。
9.根据权利要求8所述的一种系统,包括在所述建模层中的一个几何图形对象及一个图形属性对象。
10.根据权利要求1所述的一种系统,其中所述的几何图形对象包括图形信息的几何图形。
11.根据权利要求1中所述的一种系统,其中所述的图形设备对象包括显示器、打印机、与绘图仪。
12.一种用于在面向对象的操作系统中进行图形处理的方法,所述操作系统常驻在带有一个处理器的计算机上,一个存储器和一个图形设备与所述处理器相连并受其控制,该方法包括下述步骤(a)在所述存储器中建立一个建模层对象;(b)利用预定义的图形图元组从所述建模层对象生成对图形端口对象的调用;(c)在所述图形端口对象上捕捉状态信息与再现信息;以及(d)将所述状态信息与再现信息传递给一个图形设备对象,以供在图形设备上输出。
13.根据权利要求12所述的方法,还包括带有变换、外观、与剪辑信息的状态信息。
14.根据权利要求12中所述的方法,其中所述的图形设备是一个软件或硬件图形处理器。
15.一种用于图形处理的装置,包括(a)一个处理器;(b)与所述处理器相连并受其控制的一个存储器;(c)与所述处理器相连并受其控制的一个图形设备;(d)在所述存储器中的一个建模层对象;(e)在所述存储器中的一个图形端口对象;(f)采用一组预定义的图形图元从所述建模层对象生成对图形端口对象调用的装置;(g)在所述图形端口对象上捕捉状态信息与再现信息的装置;以及(h)将所述状态信息与再现信息传递给一个图形设备对象以便在所述图形设备上输出的装置。
16.根据权利要求15所述的装置,其中所述的状态信息包括变换、外观、与剪辑信息。
17.根据权利要求15所述的装置,其中所述的图形设备为一个矢量机。
18.根据权利要求15所述的装置,其中所述的图形设备为一台图形加速器。
19.根据权利要求15所述的装置,其中所述的图形设备为一个帧缓冲器。
20.根据权利要求15中所述的装置,其中所述的图形设备为一台绘图仪。
21.根据权利要求15所述的装置,其中所述的图形设备为一台打印机。
22.根据权利要求15所述的装置,其中所述的图形设备为一台显示器。
23.根据权利要求15所述的装置,其中所述的图形设备为一个PostScript处理器。
24.根据权利要求15所述的装置,其中所述的建模层对象包括至少一个几何图形对象及至少一个图形属性对象。
25.根据权利要求15所述的装置,其中,一个对象包含一种方法及数据。
26.根据权利要求25所述的装置,其中所述的对象是多形的与可扩充的。
全文摘要
一种面向对象的图形系统包括一个处理器,该处理器具有一个与之相连的显示器和一个与之相连的存储器,并在其中具有面向对象的操作系统。该图形系统在处理器的存储器中建立一个部件对象来管理图形处理。处理器中包含一个对象,用于将至少一个图形设备连接在负责诸如图形加速器、帧缓冲器、页面描述语言、及矢量机等的任务的各种对象上。该系统是完全可以扩充的并包括内装在各支持对象内的多形态处理。
文档编号G06T1/00GK1134194SQ94194006
公开日1996年10月23日 申请日期1994年1月3日 优先权日1993年11月2日
发明者阿瑟·W·卡布若, 拉杰·简因, 梅尔·李·何尔德, 约翰·彼得森, 理查德·D·韦布, 罗伯特·塞德 申请人:塔里根特公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1