面向目标的结构区域系统的制作方法

文档序号:2636410阅读:180来源:国知局
专利名称:面向目标的结构区域系统的制作方法
技术领域
本发明涉及计算机系统的改进,尤其涉及在一个图形显示设备上处理至少一个随机图形目标的区域信息的系统和方法。
本申请包括受版权保护的主题,版权拥有者允许本文作为专利文档或记录而被复制,但保留所有其他权利。
区域信息的图形处理是以有效的人机工程学方式展示图形信息的关键之所在。因此,越来越多的现代图形系统采用信息处理系统来处理包括文本和图形信息在内的各种信息,以便以更有效的方式进行信息处理。
早期的软件操作系统体系结构受其区域处理能力之限制。其限制之一是操作系统体系结构不能支持一个给定外设,若其体系结构不是设计用作或可修改用于支持该给定外设的话。另外,早期的体系结构只是以单一预定的方式对图形区域信息进行处理。
因此,本发明的主要目的是在具有存储器和显示器的计算机上以灵活方式处理图形目标及其相关区域。一组类别定义在存储设备中,用于代表几何图形图元。然后,另一组类别在存储设备中生成以代表多个几何图形操作。至少一个几何图形操作被用于第一和第二几何图形以生成最终几何图形,且该最终几何图形被显示在显示器上。可将类别容易地进行分类以支持新的硬件环境。


图1是根据本发明一个最佳实施例的个人计算机系统框图;图2示出了根据本发明一个最佳实施例用于图形目标的各种算法功能图示说明;图3示出了根据本发明一个最佳实施例的四方形加椭圆再减去多边形。
图4是根据本发明一个最佳实施例的长方形加椭圆再减去多边形的二进制树结构;图5是根据本发明一个最佳实施例的图形区域的示例;图6是根据本发明一个最佳实施例用于构成图5所示图形区域的C++源码的示例;图7和图8示出了根据本发明一个最佳实施例以两种不同方式绘制图5所示区域;图9是一个Booch图,示出了根据本发明一个最佳实施例的TGArea类别900以及与体系结构910&920之外的类别的关系;图10是根据本发明一个最佳实施例的TGArea类别的详细Booch图;图11是根据本发明一个最佳实施例的TGArea类别的Booch图;图12是根据本发明一个最佳实施例的某些CAG(结构区域几何图形)类别;
图13示出了根据本发明一个最佳实施例的CAG树;图14示出了根据本发明一个最佳实施例的几何集成图形(conglometry);图15示出了根据本发明一个最佳实施例的CAG树的主要部分;图16示出了根据本发明一个最佳实施例所用的某些术语;图17示出了根据本发明一个最佳实施例在各种帧及其它们的本源之间的连接;图18是根据本发明一个最佳实施例的抽取程序类别的Booch图;图19示出了根据本发明一个最佳实施例的类别的Booch图;图20示出了根据本发明一个最佳实施例的CAG类别的Booch图;图21是一个详细的CAG树,示出了根据本发明一个最佳实施例的CAG树的内部结构;图22是根据本发明的一个最佳实施例的CAG树内部结构的树结构;图23示出了根据本发明一个最佳实施例所用的某些术语的图示说明;图24示出了根据本发明一个最佳实施例的几何集成图形的类别层级;图25是一流程图,示出了根据本发明一个最佳实施例的详细逻辑;图26是根据本发明一个最佳实施例的详细逻辑流程图;以及图27是根据本发明一个最佳实施例的详细逻辑的流程图。
本发明最好在IBMPS/2或AppleMacintosh十算机之类的PC机中的操作系统里实施。图1示出了具有代表性的硬件环境,它展示了根据本发明的计算机的典型硬件构造,它包括一个中央处理器10(例如常规的微处理器),该中央处理器有一内部非易失存储器11以及多个经系统总线12相互连接的其他部件。图1所示工作站包括一个RAM14,ROM16,用于连接诸如磁盘部件20和软盘21之类的外设到总线上的I/O适配器18,用于把键盘24,鼠标器26,扬声器28,麦克风32以及/或其他用户接口设备(例如触摸式屏幕设备)等连到总线的用户接口适配器22,用于把工作站连到数据处理网络23的通讯适配器34,以及把总线连到显示设备38的显示适配器36。该计算机的操作系统为Apple System/7一类的操作系统。
在一个最佳实施例中,本发明是利用面向目标的编程技术以C++程序语言实现的。正如本领域一般技术人员所理解的,面向目标的编程(OOP)目标是包括数据结构和在数据上的操作的软件实体。根据任一现实社会实体的特征(以其数据元素表示)以及其行为(以其数据操纵功能表示),这些元素可以使该现实社会实体直接模型化。以这种方式,目标可以成型为具体的事物,例如人和计算机,而且亦可成型为抽象概念,例如数字或几何概念。目标技术的好处来自于三个基本原理封装,多形性,以及继承。
目标根据其功能的工作来隐藏(或封装)其数据的内部结构和算法。除了展现这些实施细节,目标展示清楚表达其抽象而无冗余信息的界面。多形性则将封装又推进一步。该概念是多个形状,一个界面。一个软件部件可以提出有关另一部件的请求而无需知道那一部件倒底是怎样的。接收该请求的部件对其进行解释可根据其变量和数据确定如何执行该请求。第三个原理是继承,它允许开发者再使用先有的设计和编码。这一能力使开发者避免从开始生成软件。进而,通过继承,开发者获得继承的行为的子类别,从而使开发者将其客户化以满足特定的需求。
一种先有技术的方法是在过程环境中对目标和类别库进行分层。市场上的许多应用结构(applicationframeworks)都采用了这种设计方法。在这种设计中,在单一操作系统的顶部有至少一个目标层级。虽然这一方式利用了目标层级中的封装,多形性以及继承这些原理,而且是对过程编程技术的重大改进,但其仍有限制。其困难之处在于虽然开发者很容易再使用他们自己的目标,但使用其他系统的目标则很难,而且开发者仍需由过程操作系统(OS)调用进入内部的非目标层级。
面向目标编程的另一方面是应用开发的结构方式。结构(framework)的最合理定义之一是由依利诺易斯大学(Uni-versity of Illinois)的强森(Ralph E.Johnson)以及普渡(Purdue)的卢梭(Vincent F.Russo)做出的。在他们1991年发表的题为“面向目标设计的再使用“(Reusing Object—Oriented Designs)(该文发表在依利诺易斯大学技术报告UIUCDC91—1696页)一文中提出了以下定义“一个抽象类别是一组合作执行一组响应的目标的设计。因此,一个结构是一组合作执行所确定的计算响应性组目标类别”。从编程观点出发,结构实际上是一组提供工作应用程序的预制结构的内连目标类别组。例如,一个用户界面结构可以提供绘制视窗,卷动条以及选项屏等的支持和“系统预置”行为,由于结构基于目标技术,该行为可被继承和置换以使开发者对结构进行扩展并在一特定的知识区域生成客户化方案。由于编程不改变初始码而只是扩展软件,上述优点便成为一个优于传统编程的主要特点。此外,由于结构提供了体系结构指导和模型并在同时允许为问题范畴提供了唯一的独特行为,开发者不会盲目地通过编码层级进行工作。
从商业观点来看,结构能够被视为在一特定知识领域封装或嵌入专门知识的方式,公司开发机构,独立软件销售商(ISV)以及系统集成者已经提出了在特定领域中的专门知识的要求,这些特定领域包括制造,财会,以及现金交易。该专门知识被嵌入编码中。结构允许这些开发机构捕捉并封装该专门知识的通用特性,其过程是将其嵌入机构的编码之中。首先,这使得开发者生成或扩展利用该专门知识的应用程序。因此把问题解决一次并使商业规律和设计被前后一致地实施和使用。另外,在结构和结构上的嵌入的专门知识,对已经在生产和销售市场(例如制造,财会)上获得专门知识的那些机构有策略的有益含义,或生物技术具有包装,再销售,以及应用其专门知识,并进而促进技术进步和推广普及的分配机制。
从历史上看,结构只是在最近才成为个人计算机平台的主流概念。这一发展得力于面向目标语言(例如C++)的效力。C++最早是在UNIX系统和研究人员的工作站上实现的,而不是在商用个人计算机上发现的。正是C++语言以及其他面向目标的语言(例如Smalltalk等等)使得许多大学和研究项目产生了当今商用结构和类别库的先驱。这些例子包括斯坦福大学(Standford University)的InterViews,卡内基一麦伦大学(Carnegie—Mellon University)的Andrewtoolkit,以及赤瑞茨大学(University of Zurich)的ET++结构。
根据想解决问题的性质以及涉及的系统层级,有多种结构。这些结构类型包括帮助开发用户界面的应用程序结构以及提供基本系统软件服务(例如通讯,打印,文件系统支持,图形等等)的低级结构。应用结构的商用例子是MacApp(Apple),Bedrock(Symantec),OWL(Borland),NeXtStepApp Kit(NeXT),以及Smalltalk—80 MVC(ParcPlace)等等。
结构编程要求开发者有与常规的其他系统不同的新思维方式。事实上,它与传统概念的“编程”全然不同。在以前的操作系统中(例如DOS或UNIX),开发者自己的程序提供了所有结构。操作系统通过系统调用提供服务“——”开发者的程序在需要服务时以及服务完成控制返回时进行调用。程序结构基于嵌入开发者写的编码中的控制流程。
当结构使用时,其过程相反,开发者不再依赖控制流程。开发者必须根据执行流程事先了解编程任务的趋向。进而,必须依据目标的响应性进行思考,这必须根据结构确定何时执行任务。由开发者所写的程序由不是开发者写的而且开发者从未见到过的编码激励。控制流程中的转换可能对只在过程编程中有经验的开发者构成较大的心理障碍。但是,一旦明白之后,结构编程所需工作就大大少于其他编程。
以一个应用结构(application framework)给用户提供预制功能性的同样方法,系统结构(system frameworks)(正如在最佳实施例中包括的)通过提供系统级服务而实现同样概念。系统程序员之类的开发者可用其进行子类别/置换以生成客户化的方案。例如,考虑一个可以提供基础以支持视频,音频,MIDI、动画等等新的以及多功能设备的多媒体结构。需要支持一种新设备的开发者必须写一个设备驱动程序。若以结构完成这一任务,则开发者只需提供该新设备所要求的特性和行为。
在这种情况下,开发者提供将为该多媒体结构调用的某种成员功能实施。开发者可得到的直接的好处在于每类设备需要的通用编码已由多媒体结构提供了。这意味着开发者要编写、测试和检测的设备驱动程序编码减少了。使用系统结构的另一例子是对于小型计算机系统接口(SCSI)设备,NuBus卡,以及图形设备提供各自的I/O结构。由于有继承功能性,每个结构为在其设备类别中发现的通用功能性提供支持。其他开发者则可依据对各种设备一致的界面。
本发明的一个最佳实施例采用了结构的概念并将其应用于整个系统,对于商业和企业开发者,系统集成商或OEM,这意味着象MacApp一类的结构所展示的优点可以不仅作用于文本和用户界面之类的应用事物,而且亦可用于系统的服务,例如图形、多媒体、文件系统、I/O以及测试等等。
在一个最佳实施例的体系结构中的应用程序生成基本上与编写附加到结构协议的特定域的谜块类似,在这一方式中,编程的整个概念改变了,代之以在调用多个API层级的编码行之后写编码行,软件将由在该环境中的先有结构导出的类别所发展,并然后根据需要加入新行为并/或替换继承的行为。
如此,开发者的应用程序成为由所有其他结构应用程序编写和共享的编码集。由于开发者将可在相互的工作上工作,因此这是一个很有力的概念。这也为开发者提供了根据需要进行客户化的灵活性。某些结构将被原样使用,在某些情况下,客户化的量将很小,所以开发者插入的谜块将很小。在另外的情况中,用户可以进行很大修改并生成全新的事件。在一个最佳实施例中,如图1所示,在RAM14中的程序由CPU10的控制并用一个面向目标的图形结构来管理各种任务。
词汇表区域(Area)—一个TGArea目标。一个区域是一个集成几何图形,它可以是任意形状,只要它可以由基本几何图形的有限集所定义。
基本几何图形(Basic Geometry)—一个“原始”几何图形,它是图形设备语言的一部分。所有集成几何图形必须由一定数量的基本几何图形组成。例如,TGRect,TGEllipse,和TGPolygon都是基本几何图形,而TGArea则是一个集成几何图形,因为其由众多的基本几何图形所组成。
CAG—结构区域几何图形(其来自于CSG的二维或结构固态几何图形)。其为在几何图形上进行布示运算(加、减、与、以及异—或)从而导致一个新的几何图形。
集成几何图形(conglometry)—集成几何图形是一个MAreaGeometry子类别。一个单独的集成几何图形可以由多个基本几何图形组成。例如,它可包括一个四方形和一个椭圆的交集。
几何图形(Geometry)—一个在空间中定义一个区域或通路的目标。空间中的任意给定点都在该通路之上或之外,或在区域之内或之外。
GrafEdge—代表一个几何图形的边界部分的目标。例如,一个椭圆通常由两个GrafEdge所成型一个在左边而另一个在右边。另一例子是一个多边形,它的五条边可以由五个GrafEdge所成型。
转换—在一个几何图形中穿过一个边的行为。例如,穿过一个椭圆的直线在其进入该椭圆完成了一次转换并在离开该椭圆时进行了另一次转换。
引言TGArea类别是一个随型形状区域的设备独立说明。通过在其他区域定义几何图形(例如四方形,椭圆,和多边形)上进行二进制CAG操作即可定义一个TGArea目标(其后称为区域)。图2是应用于图形目标的各种算法函数的图形说明。200示出了正方形和圆的相加操作,210则是它们的减操作,220为其与操作而230则为异操作。代表二进制树的数据结构可形成在计算机系统的存储器中以叙述任何区域的内容。例如,图3示出了四方形加椭圆并减去一个多边形(四方形+椭圆-多边形)的情况。相关的二进制树结构示于图4中。区域的数学描述被定义为四方形加椭圆减多边形。当图3中的图形区域被充满时,只有加重的轮廓300被充满。类似地,它其成帧时,该帧是围绕充满区域的边界绘制的。
应用TGArea类别最通常的应用是定义图形的边界。例如,一个视窗系统使用区域来代表其视窗的可见区域和形状。例如在图5中提供了根据本发明一个最佳实施例的多个重叠视图的图示。视图A与视图B重叠。视图A的形状为椭圆而视图B则为矩形。视图A的可视区只为其形状,因其未被其他视图覆盖。但视图B则由从其本身形状中减去视图A所形成,从而导致矩形减去椭圆形。这类几何图形信息可记录在TGArea目标中。重要的是要注意到就象在Macintosh区域中一样,在与视图A和B的边界附近的区域并不共有亦非弧立的。这意味着当在屏幕上绘制这些区域时,不会有象素被绘制两次或未被绘制。它亦意味着选中测试程序从不报告模糊不清的结果。
应用程序开发者应用程序开发者可把区域看作与其他几何图形相同。换言之,区域可被填充,成帧以及进行选中测试。但是,与其他几何图形不同,区域可被看作是一个“模糊”的几何图形;即其可被不加区别地变换而与几何图形的内部标识无关。例如,可将一预有的变换用于一个矩形区域而导致其成为非矩形,也可以在内部将其本身转换成多边形。反之,TGRect目标不能随意变换而仍将是矩形。
本发明的最佳实施例简化了区域的构成。图5即为本发明的最佳实施例的一个图形区域的示例。而图6是用来构成图5所示图形区域的C++源码的示例。源码接近于TGraf-port。当TGArea目标被绘制时,它被看作象是任意其他几何图形。它可被填充,成帧或两者兼有之。该帧可以是一个极细线的帧或粗线帧,而且其可有复合特性,例如点划线或联结方式。图7和图8示出了可以两种不同方式绘制图5的区域。图7示出了具有细线笔绘制的填充和成帧的图形区域,而图8则示出了由点划线笔绘制的填充和成帧图形区域。
体系结构有几种支持TGArea类别的底层体系结构(architec-ture)的类别组。但是,大部分应用程序可以只由TGArea类别所简化。图9是示出TGArea类别900及其与体系结构910和920之外的类别的关系的Booch图。其中,点划线的“云彩”指示类别或类别的集合(即TGArea类别900),连接类别的箭头从子类别导向主类别并指示一个包括封装,继承和多性形的特性的层级,它在目标技术和先有技术接受的图形记号中为人所理解。双线指出在实施或界面中采用的类别。在一条线段一端处的圆指示在该类别中的包含或使用在线段端点处的圆。有关该记号的完整说明,请参见由GradyBooch所著并由Benjamin/Cummings出版公司在1991年出版并受版权保护的题为“Object Oriented Design”一文。图9指示出由TGrafPort 920和TGrafDevice 930类别所用的TGArea类别900。例如,使用TGratPort目标920可以在屏幕上划出区域。该再现实际上是由代表屏幕的TGrafDevice目标910所完成的。
TGArea类别900叙述如下,只为每个类别提供不同的功能文件。继承功能和执行类似任务的功能只在母类别中被记录。
区域类别TGArea类别是大部分客户将使用的类别。它支持需要构成一个区域并提出请求的操作,而且它可从任意的定义区域的基本几何图形中生成。图10是根据本发明一个最佳实施例的TGArea的Booch图。
TGArea该TGArea类别包括一个内部集成几何图形目标,而且它安排对该集成几何图形的所有调用。换言之,它是一个用于集成几何图形的轮询程序(wrapper)。如前所述,可由集成几何图形的二进制树成型一个区域。该TGArea类别亦可进行树的维护,例如·树优化。例如,若一个大矩形完全包含一个小的椭圆,则该椭圆可从树中去除。
·简化树。例如,两个相邻矩形可被转换成单一的矩形或多边形。
·用于TGArea类别的C++码的表示如下<pre listing-type="program-listing"><![CDATA[class TGArea{publicTGArea();TGArea(const TGRect&amp;g);TGArea(const TGEllipse&amp;g);TGArea(const TGPolygon&amp;g);TGArea(const TGLoop&amp;g);TGArea(const TGGlyphRun&amp;g);TGArea(const TGArea&amp;g);TGArea(const TAreaGeometryHandle&amp;g);virtual~TGArea();]]></pre>TGArea可从任意区域定义基本几何图形中构成。TGArea目标亦可从TAreaGeometryHandle(即任意集成几何图形)目标中构成。
<pre listing-type="program-listing"><![CDATA[void Add(const TGArea&amp;);const TGArea&amp;operator+=(const TGArea&amp;);]]></pre>这些函数完成两个区域的相加(和)。它们将特定的区域加到这个区域。
<pre listing-type="program-listing"><![CDATA[void Subtract(const TGArea&amp;);const TGArea&amp;operator-=(const TGArea&amp;);]]></pre>这些函数执行两个区域的相减(或差)。它们从该区域中减去特定区域。
<pre listing-type="program-listing"><![CDATA[void Intersect(const TGArea&amp;);const TGArea&amp;operator*=(const TGArea&amp;);]]></pre>列示于上的函数执行两个区域的相与。它们与该区域的特定区域相交。
<pre listing-type="program-listing"><![CDATA[void ExclusiveOr(const TGArea&amp;);const TGArea&amp;operator^=(const TGArea&amp;);]]></pre>以上列示的函数执行在两个区域上的异或操作。它们与该区域的特定区域相异。
<pre listing-type="program-listing"><![CDATA[void TransformBy(const TGrafMatrix&amp;matrix);]]></pre>该函数用特定矩阵对区域进行变换。
<pre listing-type="program-listing"><![CDATA[void Extract(TGrafExtractor&amp;extractor,TCAGNode*node,const TMatrixState&amp;matrixState=TGlobalMa-trixStateGetIdentity())const;]]></pre>以上列示函数执行抽取功能,它根据基本几何图形(TGRect,TGEllipse等)表示区域的几何结构。这些功能是通过适当调用特定TGrafExtractor目标实现的。CAG节点在区域的母节点中被通过。换言之,由区域生成的任何CAG节点应该有其母节点所有的节点。这使CAG树得以建立。TMatrixState目标指定区域存在的该调用中坐标系统。它可直接通过TGrafExtractor目标,或基于该目标的新目标可通过T GrafExtractor。
<pre listing-type="program-listing"><![CDATA[Boolean IsEnpty()Const;]]></pre>若该区域为空的话(即它不包括几何区域),该功能返回TRUE。
<pre listing-type="program-listing"><![CDATA[void SetToEmpty();]]></pre>该上述功能将区域初始化为空区域。它等效于调用系统预置构成程序,或调用GetEmptyArea。
<pre listing-type="program-listing"><![CDATA[Boolean IsRectangular()const;]]></pre>这一功能在区域是单一不旋转矩形时返回TRUE。
<pre listing-type="program-listing"><![CDATA[Boolean IsRectilinear()const;]]></pre>该功能在区域只由水平和垂直边组成时返回TRUE。例如,由多个不旋转矩形构成的区域即为直线的。
<pre listing-type="program-listing"><![CDATA[Boolean IsSingular()const;]]></pre>该功能在区域只包括一个基本几何图形时返回TRUE。例如,由一个多边形构成的区域即为单一的,而由矩形减去圆形所构成的区域则不是。
<pre listing-type="program-listing"><![CDATA[TGRect GetBounds()const;]]></pre>上述功能返回一个它完全包含了该区域的自由边界的矩形。
<pre listing-type="program-listing"><![CDATA[Boolean Contains(Const TGPoint&amp;point)const;Boolean Contains(Const TGRect&amp;rect)const;Boolean Interseets(Cornt TGPect&amp;rect)const;]]></pre>这些功能在区域上执行简单选中测试操作。
<pre listing-type="program-listing"><![CDATA[TPseudoTimeStamp GetTimeStamp()const;]]></pre>该功能返回区域的时间标记,它在区域修改时自动更改。
<pre listing-type="program-listing"><![CDATA[const TGArea&amp;operator=(const TGArea&amp;area);]]></pre>该功能是一个赋值算子。
<pre listing-type="program-listing"><![CDATA[Boolean operator==(const TGArea&amp;area);Boolean operator!=(const TGArea&amp;area);]]></pre>这些是相等算子。
<pre listing-type="program-listing"><![CDATA[const TGArea&amp;operator>>=(TStream&amp;stream)const;const TGArea&amp;operator<<=(TStream&amp;stream);]]></pre>这些是流算子。
<pre listing-type="program-listing"><![CDATA[Static const TGArea&amp;GetEmptyArea();Static const TGArea&amp;GetInfiniteArea();]]></pre>这些功能分别返回相对于空的常数以及无限大的区域。
<pre listing-type="program-listing"><![CDATA[};TGArea operator+(const TGArea&amp;arca0,constTGArea&amp;area1);]]></pre>该功能执行两个区域的相加,它加入一个特定区域并返回合成的区域。
<pre listing-type="program-listing"><![CDATA[TGArea operator—(const TGArea&amp;area0,constTGArea&amp;area1);]]></pre>该功能执行两个区域的相减。它从area0中减去area1并返回结果区域。
<pre listing-type="program-listing"><![CDATA[TGArea operator*(const TGArea&amp;area0,constTGArea&amp;area1);]]></pre>该功能执行两个区域的相与操作。它与特定的区域相与并返回结果区域。
<pre listing-type="program-listing"><![CDATA[TGArea operator^(const TGArea&amp;area0,constTGArea&amp;area1);]]></pre>该功能执行两个区域的相异操作。它与特定区域相异并返回结果区域。
详细的体系结构本部分叙述高级程序员所需的类别。这些程序员包括grafDevice程序员以及其他需要重复通过包含在一个区域中的几何图形进行重复的程序员。图11是本发明一个最佳实施例的这些类别的Booch框图。TGArea类别1000可对TGrafExtractor目标1020表达其内部几何图形。TCAGN-ode子类别1010,1030和1040用于表达包含在该区域中的每个单独的基本几何图形的轮询项数行为。上述类别及其子类别被叙述如下。只有在每个类别中明显不同的功能才叙述;继承的功能和执行类似任务的功能通常只在主类别中予以说明。
CAG类别为了被再现和选中测试等,集成几何图形必须提供内部/外部确定的方法;即再现(或选中测试等)码必须能确定一个点是否位于该集成几何图形之内或之外。这由CAG类别实现。图12示出了某些CAG类别。在再现集成几何图形之前,TCAGNode子类别的二进制树被构成,它提供该集成几何图形二进制树的镜象。在一个集成几何图形中的每个叶节点必须有一个对该树的一个叶节点的参数。当遇到集成几何图形中的一个边时,适当的CAG节点被通知发生了一个转变。
参见图3,4,5和6所示例子来考虑以下情况。集成几何图形由一个矩形加一个椭圆再减去一个多边形组成,如图3所示。其二进制树示于图4。该二进制树既代表该集成几何图形的内部结构,同时代表再现之前构成的CAG树的结构。但是,对高级程序员而言,树的准确结构并不重要。它由TGArea类别自动地建立。图13是CAG树的示例。
在每个基本几何图形中的边都分别指向树中的CAG节点叶。只要当一个边有一转变,便通知其CAG节点,它导致树在其顶部重新计算结果值。该值被用于确定是否当前点处于集成几何图形之内或之外。例如考虑一个扫描转换处理。每行象素代表一个水平通道,它以不同y值穿过该集成几何图形。每个水平通道在从左向右穿过每条边时都导致发生转变。每次转变发生时,扫描转换询问CAG树的根以确定是否当前位置在整个集成几何图形之中以确定要接通哪个象素。当成帧一个集成几何图形时情况更为复杂。图14示出了一个包括矩形加椭圆的集成几何图形1400。其二进制树由1410表示。图15是CAG树重要部分的详细图。
被成帧的集成几何图形由三种边定义填充,左帧和右帧(“左”和“右”是随意选择以供区分两个帧边,并无顺序要求于其中)。每个CAG节点都有三种转变功能,其中之一用于三种边的任何一条边。所有去往每个CAG节点的转换值(除左节点外)假设都展示偶—奇行为。换言之,节点必须将其进入值看作为偶—奇值,且它们必须产生具有偶—奇行为的新值。在以下部分,某些有关几何图形填充和成帧区域的语言可能含糊不清。图16示出了一些用于本发明的最佳实施例的术语。
TCAGNodeTCAGNode是提供所有CAG类别的共用协议的抽象类别。
<pre listing-type="program-listing"><![CDATA[class TCAGNode{publicvirtual~TCAGNode();typedef WrapCount long;]]></pre>
“轮询次数”是一个在一特定点表示几何图形状态的累积值。必须保持轮询次数以确定是否在几何图形中的边被一个通路穿过时,该通路是进入还是退出该几何图形。
<pre listing-type="program-listing"><![CDATA[virtual void Transition(WrapCount fill)=0;virtual void T ransitionLeftFrame(WrapCount left-Frame)=0;virtual void TransitionRightFrame(WrapCount right-Frame)=0;]]></pre>每个TCAGNode子类别都有三种转换功能,它们在其子女的填充和成帧状态中发生转换时由子节点调用。例如,当发生边转换时,边就调用主节点的转换功能之一。
<pre listing-type="program-listing"><![CDATA[protectedTCAGNode();TCAGNode(const TCAGNode&amp;);]]></pre>以上代码是空的和复制的构成程序。由于是抽象类别,所以它们受到保护。
<pre listing-type="program-listing"><![CDATA[TCAGNode&amp;operator=(const TCAGNode&amp;);]]></pre>以上代码为赋值算子。由于是抽象类别,所以受到保护。
<pre listing-type="program-listing"><![CDATA[};TCAGChild]]></pre>以上代码是提供具有母节点的所有CAG节点的共同协议的类别。母节点是在二进制树中较高的一个层级。它们由其子女所引用。
<pre listing-type="program-listing"><![CDATA[class TCAGChildpublic TCAGNode{publicvirtual~T CAGChild();protectedTCAGChild(TCAGNode*parent);]]></pre>以上构成程序采用一个指向母CAG节点(树中较高层级的节点)的指针。由于它是抽象类别,所以受到保护。
<pre listing-type="program-listing"><![CDATA[};TCAGUnary]]></pre>以上代码定义了提供所有子CAG节点的共同协议的类别。该子CAG节点的值由一个源所控制。
<pre listing-type="program-listing"><![CDATA[class TCAGUnarypublic TCAGChild{publicvirtual~TCAGU nary();TCAGLeftFrameLink*GetLeftFrameLink();TCAGRightFrameLink*GetRightFrameLink();]]></pre>以上两功能返回对TCAGLeftFrameLink和TCA-GRightFrameLink目标的指针。它们通常被调用以连接左右帧转换功能。对TCAGLeftFrameLink和TCAGRight-FrameLink类别的引用如下。
<pre listing-type="program-listing"><![CDATA[protectedTCAGUnary(TCAGNode*parent);]]></pre>以上构成程序获得对于母CAG节点的指针。由于是抽象节点,所以其受保护。
TCAGLefeFrameLink和TCAGRightFrameLink用于几何图形成帧之时。当一特定GrafEdge的转换发生时,其母CAG节点的转换功能之一必须被调用。但是,若GrafEdge对应于几何图形的左帧或右帧,则帧转换功能之一必须被调用,而非填充转换功能。由于GrafEdge本身并不知道要调用哪个转换功能,所以目标必须被用来把填充转换导向左帧或右帧转换。图17示出了本发明一个最佳实施例的不同帧以及其母帧之间的连接。没有类别TCAGLeft-FrameLink和TCAGRightFrameLink,在帧GrafEdges及其母帧之间的连接就会以不同方式(即以功能指针方式)实现。
<pre listing-type="program-listing"><![CDATA[class TCAGLeftFrameLinkpublic TCAGUnary{publicTCAGLeftFrameLink(TCA GNode*parent);virtual~TCAGLeftFrameLink();virtual void Transition(WrapCount fill);]]></pre>填充转换功能仅只调用其母CAG节点的Transition-LeftFrame功能。
抽取程序类别以上所列之集成几何图形需要将其表示为基本几何图形(TGRect,TGEllipse等)的集合的手段。这由图18所示的抽取程序类别实现。TGArea目标可被“反复”的唯一方式是使用TGrafExtractor类别。子类别提供与CAG节点一起处理基本几何图形以便产生所需结果的行为。例如,成帧缓冲图形设备用若干抽取程序子类别来发现一个区域的内容以便绘制该区域。
TGrafExtractor该类别允许集成几何图形将其内容倾卸于其中。它有一用于每个基本几何图形的调用。它要求由每个子类别支持(尤其图形设备)。当要求抽取时,集成几何图形把一个引用绘到一个抽取程序,它对其进行调用以表达其内部几何结构。
<pre listing-type="program-listing"><![CDATA[class TGrafExtractor{publicvirtual~TGratExtractor();virtual void ExtractRect(const TGRect&amp;,TCAGUnary*,const TMatrixState&amp;matrixState=TGlobalMatrixStateGetIdentity())=0;virtual void ExtractEllipse(const TGEllipse&amp;TCAGUnary*,const TMatrixState&amp;matrixState=TGlobalMatrixStateGetIdentity())=0;virtual void ExtractPolygon(const TGPolygon&amp;,TCAGUnary*,corst TMatrixState&amp;matrixState=TGlobalMatrixStateGetIdentity())=0;virtual void ExtractLoop(const TGLoop&amp;,TCAGUnary*,const TMatrixState&amp;matrixState=TGlobalMatrixStateGetldentity())=0;virtual void ExtractGlyPhRun(const TGGlyPhRun&amp;,TCAGUnary*,cornst TMatrixState&amp;matrixState=TGlobalMatrixtateGetIdentity())=0;virtual void ExtractLine(const TGLine&amp;,TCAGUrnary*,corst TMatrixState&amp;matrixState=TGlobalMatrixStateGetIdentity())=0;virtual void ExtractPolyline (const TGPolyline&amp;,TCAGUnary*,const TMatrixState&amp;matrixState=TGlobalMatrixStateGetIdentity())=0;virtual void ExtractCurve(const TGCurve&amp;,TCAGUrnary*,const TMatrixState&amp;matrixState=TGlobalMatrixStateGetIdentity())=0;]]></pre>
一个集成几何图形的Extract功能可以调用任何Ex-tractX功能以表达其几何内容。例如,包括矩形加椭圆的集成几何图形将对ExtractRect和ExtractEllipse进行调用。TCAGUnary目标去往每个功能并允许该集成几何图形表达用于其几何图形的轮询次数行为(即偶—奇或分枝数)。它生成一个适当的TCAGUnary子类别的目标。该目标然后被任何为该几何图形生成的较低层几何图形(即GrafEdges)所引用。这就是CAG节点树的叶子是如何连到较低层几何图形的。
去往每个功能的TMatrixState目的表达该几何图形处于其中的坐标系统。在CAG节点被收集用于集成几何图形后,可用最终CAG节点树确定是否一个点处于整个集成几何图形之内或之外。树的根通往下述Render功能。
内部体系结构用于支持TGArea体系结构的类别的体系结构示于下。图19表示类别的Booch图。TGArea类别1900包含一个TAreaGeometryHandle目标1960,它是MAreaGeome-try子类别1950(集成几何图形)的等代物。换言之,TGArea类别1900是TAreaGeometryHandle类别1960的绕接程序(wrapper),而且TAreaGeometryHandle类别1960是MAreaGeometry类别1950的替代。TGArea1900,TAreaGeometryHandle1960和MAreaGeometry1950类别都向TGrafExtractor目标1910表达了其内部几何图形。TCAGNode子类别1940用于表达每个单独的MAreaGeometry目标1950的轮询次数行为。需要提供新的客户化集成几何图形的用户将对MAreaGeometry 1950进行子分类。为了利用MAreaGeometry类别1950的引用计数,它们必须将其在TAreaGeometryHandle目标1960中环境。上述类别及其子类别将详述如下。
CAG类别为再现或选中测试等,集成几何图形必须提供内部/外部确定方法。例如,再现(或选中测试等)代码必须确定是否一个点位于集成几何图形之内部或外部。该处理由图20所示的CAG类别实现。在再现一个集成几何图形之前,TCAGNode子类别的二进制树被构成以镜像图20所示的集成几何图形的二进制数。在一个集成几何图形中的每条边必须有一个对该树的叶节点之一的引用。当遇到集成几何图形中的一条边时,适当的CAG节点便被通知已发生了转换。参见图3,4,5和6并考虑以下情况。该集成几何图形包括一个矩形加一椭圆再减去一多边形(都是基本几何图形),如图3所示。图4示出其二进制树,该树代表集成几何图形的内部结构以及在再现之前构成的CAG树结构。
图21是详细的CAG树,它示出了CAG树的内部结构。每个基本几何图形的边都指向各自树中的CAG节点叶。当边转变时,通知其CAG节点,它导致树在其顶部重新计算结果值。该值用于确定是否当前的点在集成几何图形之内或之外。
例如考虑扫描转换处理。每行象素都代表在不同y值处通过集成几何图形的水平通路。在每个水平通路从左向右通过边时导致转变发生。每次转变时,扫描转换询问CAG树的根以确定当前位置是否在整个集成几何图形之内,以确定要接通哪个象素。
当图14所示的集成几何图形成帧时,情况略为复杂一些。用于内部结构的CAG树示于图22中。成帧的集成几何图形由三种边定义填充,左帧和右帧(“左”和“右”是随意选中以区分两个帧的边,并无顺序而言)。每个CAG节点有三个转变功能,每个用于三种边之一。所有去往CAG节点(除叶节点之外)的转变值假设展示了偶一奇行为。例如,TCA-GAdd节点将其进入值视为偶—奇值,而且其必须产生具有偶—奇行为的新值。在这时,循环进行CAG树的评价一个对CAG节点的转变调用可能导致对其母节点的转变调用。这可能有益于测试一个非递归算法,该算法算术地行走于该树以改进性能并将栈使用减至最少。但是,这是低优先级,因为·实际上,大部分区域很可能不够深以导致严重问题;以及·一个转变调用的栈使用相当低。
在以下叙述中,某些有关几何图形填充和成帧区域的语言可能比较模糊不清。图23是一展示用于本发明的一个最佳实施例的术语的图。
TCAGNodeTCAGNode是为所有CAG类别提供共用协议的抽象类别。
<pre listing-type="program-listing"><![CDATA[class TCAGNode{publicvirtual~TCAGNode();typedef WrapCount long;]]></pre>“轮询计数(wrap count)”是表示在一特定点处的几何图形状态的累积值。必须保持轮询计数以确定是否一个通路在穿过几何图形的边的时候进入或离开该几何图形。
<pre listing-type="program-listing"><![CDATA[virtual void Transition(WrapCount fill)=0;virtual void TransitionLeftFrame(WrapCount left-Frame)=0;virtual void TransitionRightFrame(WrapCount right-Frame)=0;]]></pre>每个TCAGNode子类别都有三种转变功能,它们在子类的填充和成帧状态中发生转变时由子节点调用。例如,当一条边转变发生时,该边调用其父母的转变功能之一。
集成几何图形类别一个多形的集成几何图形类别组被需要来存储集成几何图形的二进制树(与基本几何图形不同,它不共用联接)。图24示出了根据本发明一个最佳实施例的集成几何图形类别层级。
MAreaGeometry 2400
该类别提供了由所有集成几何图形共享的协议。它包括抽取,转换,选中测试,比较和不同的询问(矩形,直线,空白和单数),它还包括MCollectible和MReferenceCounted协改。
抽取是MAreaGeometry子类别表达其内部几何结构的处理。
<pre listing-type="program-listing"><![CDATA[class MAreaGeometrypublic MCollectible,publicMReferenceCounted{publicvirtual~MAreaGeometry();virtual void Extract(TGraf Extractor&amp;extractor,TCAGNode*node,const TMatrixState&amp;matrixState=TGlobalMa-trixStateGetIdentity())const=0;]]></pre>以上代码是抽取功能,表达了根据基本几何图形(TGRect,TGEllipse等)的集成几何图形结构。通过对指定的TGrafExtrator目标的适当调用可完成这一功能。例如,当MAreaGeometry子类别绘制到帧缓冲设备时调用该功能。进入的CAG节点是集成几何图形的母节点。换言之,由集成几何图形生成的任何CAG节点都有这一节点作为其母节点。这允许CAG树被建立。该TMatrixState目标指定几何图形存在于其中以供调用的坐标系统。它可直接去往TGrafExtractor目标,或基于它的新目标可去往TGrafEx-tractor。
<pre listing-type="program-listing"><![CDATA[virtual MAreaGeometry*CloneAndTransform(constTGrafMatrix m)const=0;]]></pre>该功能复制目标,由特定矩阵变换目标,并返回一个指针到新目标。该新目标可以或不可以有相同的具体类型。例如,在TRectGeometry目标2450上执行的共同操作返回一个TPolygonGeometry目标,因为该结果不再是一个矩形。
<pre listing-type="program-listing"><![CDATA[virtual MAreaGeometry*CloneAndAdd(constMAreaGeometry&amp;)eonst=0;virtual MAreaGeometry*CloneAndSubtract(constMAreaGeometry&amp;)const=0;virtual MAreaGeometry*CloneAndIntersect(constMAreaGeometry&amp;)const=0;virtual MAreaGeometry*CloneAndExclusiveOr(constMAreaGeometry&amp;)const=0;]]></pre>上述代码中的功能用于复制目标,执行相应的CAG操作,并返回一个指针到新目标。该新目标可以或不可以具有相同的具体类型。例如,把TPolygonGeometry目标与TEl-lipseGeometry目标相加返回一个TAddGeometry目标。
几何图形替代类别该类别是一个引用集成几何图形的绕接程序类别。它允许几何数据共用,即多个替代可以引用相同的MAreaGeometry子类别2400。由于它避免了不必要的几何数据复制,所以是理想的。该替代(或处理),TAreaGeome-tryHandle,用于共享只读几何数据。
图25是一流程图,示出了根据本发明一个最佳实施例的详细逻辑。处理始于功能框2500,在该处,根据要被剪取的特定几何图形调用抽取功能。在任何情况下,在功能框2510,2540或2570处都生成偶奇目标而且在矩形要被剪取时,控制去往2520,在椭圆要被处理时,控制去往2550,在直线几何图形要被处理时,控制去往2580。控制通过2530,2560或2590返回。
图26是示出根据本发明一个最佳实施例详细逻辑的流程图。处理始于功能框2600以调用包含的区域目标的抽取功能。然后,若该区域目标是多边形几何图形,则在决定框2610处进行测试以确定是否该图形为偶—奇填充格式。若是,则生成偶奇目标并使母CAG目标去往生成的目标(在功能框2630处),在功能框2640处处理该区域并在终止2650处返回控制。若图形由决定框2610判定不是偶—奇填充格式,则在功能框2660处生成一个分枝数目标且母CAG目标在功能框2660处去往生成的目标,在功能框2640处处理该区域且在终止2650处返回控制。若区域目标是一个闭合(闭合曲线)几何图形,则在决定框2615处进行测试以确定是否图形为偶—奇填充格式。若是,则在功能框2670处生成偶—奇目标并使母CAG目标去往生成的目标,在功能框2680处处理区域并在终点2682处返回控制。若图形由决定框2615判定不是偶—奇填充格式,则在功能框2690中生成分枝数目标并在框2680处将母CAG目标送往生成的目标,在功能框2680处处理该区域并在终止2682处返回控制。
图27是展示根据本发明一个最佳实施例的详细逻辑流程图。处理始于功能框2700以调用与包含的区域对应的抽取功能。然后,若抽取功能是变换的几何图形,则在功能框2710处将变换应用于包含的区域,在2720处将抽取功能应用于包含的区域并在终止2730处完成处理。若抽取功能是相加几何图形,则母目标被送往生成的目标(在功能框2750处)。则在功能框2750和2760处,调用第一(左)和第二(右)目标的抽取功能。最后,处理完成于终止2770处。
权利要求
1.在具有存储器和显示器的计算机上处理图形目标的方法,其特征在于包括以下步骤(a)在存储器中定义代表多个几何图形的类别;(b)在存储器中生成代表多个几何图形操作的类别;(c)将至少一个几何图形操作应用到第一和第二几何图形以生成合成几何图形;以及(d)在显示器上显示合成的几何图形。
2.权利要求1所述方法,还包括在存储器中定义代表一个几何图形相加操作的类别的步骤。
3.权利要求1所述方法,还包括在存储器中定义代表几何图形的异操作的类别的步骤。
4.权利要求1所述方法,还包括在存储器中定义代表几何图形的减操作的类别的步骤。
5.权利要求1所述方法,还包括在存储器中定义代表几何图形的与操作的类别的步骤。
6.权利要求1所述方法,还包括在存储器中定义代表椭圆几何图形的类别的步骤。
7.权利要求1所述方法,还包括在存储器中定义代表一个矩形几何图形的类别的步骤。
8.权利要求1所述方法,还包括在存储器中定义代表一个多边形几何图形的类别的步骤。
9.权利要求1所述方法,还包括在存储器中定义代表一个闭合几何图形的类别的步骤。
10.权利要求1所述方法,还包括在存储器中定义代表一个符号几何图形的类别的步骤。
11.权利要求1所述方法,还包括多形地表示目标的步骤。
12.权利要求11所述方法,还包括以可扩展方式表示目标的步骤。
13.权利要求1所述方法,还包括以可扩展方式确定扫描行象素是否位于图形目标内或外的步骤。
14.权利要求13所述方法,还包括用偶—奇处理对区域目标进行处理的步骤。
15.权利要求13所述方法,还包括用分枝数处理对区域目标进行处理的步骤。
16.权利要求1所述方法,还包括多形地表示多个几何图形的步骤。
17.权利要求16所述方法,还包括以可扩展方式代表多个几何图形的步骤。
18.用于处理图形目标的装置,其特征在于包括(a)一个处理器;(b)与处理器相连并由其控制的存储器;(c)与处理器相连并由其控制的显示器;(d)在存储器中定义代表多个几何图形的类别的装置;(e)在存储器中生成代表多个几何图形操作的类别的装置;(f)将至少一个几何图形操作用于第一几何图形和第二几何图形以生成合成几何图形的装置;以及(g)在显示器上显示合成几何图形的装置。
19.权利要求18所述装置,还包括在存储器中定义代表一个几何图形相加操作的类别的装置。
20.权利要求18所述装置,还包括在存储器中定义代表几何图形的异操作的类别的装置。21.权利要求18所述装置,还包括在存储器中定义代表几何图形的减操作的类别的装置。
22.权利要求18所述装置,还包括在存储器中定义代表几何图形的与操作的类别的装置。
23.权利要求18所述装置,还包括在存储器中定义代表椭圆几何图形的类别装置。
24.权利要求18所述装置,还包括在存储器中定义代表一个矩形几何图形的类别的装置。
25.权利要求18所述装置,还包括在存储器中定义代表一个多边形几何图形的类别的装置。
26.权利要求18所述装置,还包括在存储器中定义代表一个闭合几何图形的类别的装置。
27.权利要求18所述装置,还包括在存储器中定义代表一个符号几何图形的类别的装置。
28.权利要求18所述装置,还包括多形地表示目标的装置。
29.权利要求28所述装置,还包括以可扩展方式表示目标的装置。
30.权利要求18所述装置,还包括以可扩展方式确定扫描行象素是否位于图形目标内或外的装置。
31.权利要求29所述装置,还包括用偶—奇处理对区域目标进行处理的装置。
32.权利要求29所述装置,还包括用分枝数处理对区域目标进行处理的装置。
33.权利要求18所述装置,还包括多形地表示多个目标装置。
34.权利要求33所述装置,还包括以可扩展方式代表多个目标的装置。
35.用于在具有存储器并与显示器相连的计算机上处理图形目标的方法,其特征在于包括以下步骤(a)在存储器中定义表示多个几何图形的类别;(b)在存储器中生成表示多个几何图形操作的类别;(c)在存储器中定义至少一个表示至少一个几何图形处理操作的类别;(d)用至少一个在存储器中表示至少一个几何图形处理操作的类别处理一个几何图形目标以生成一个合成几何图形目标;以及(e)在显示器上显示合成几何图形目标。
36.权利要求35所述方法,还包括将至少一个几何图形处理操作应用到第一和第二几何图形以生成合成几何图形的步骤。
37.权利要求35所述方法,其中的处理操作是再现操作。
38.权利要求35所述方法,其中的处理操作是打印操作。
39.权利要求35所述方法,其中的处理操作是图符操作。
40.权利要求35所述方法,还包括用多形和可扩展方式处理几何图形目标以再现该几何图形目标的步骤。
全文摘要
用于在具有存储器和连接有显示器的计算机上处理图形目标并在定义区域几何图形(例如四方形,椭圆形和多边形)上由面向目标的操作系统进行二进制结构区域几何图形(CAG)操作的方法和系统。这些操作包括一个区域的结构及在外设上显示区域几何图形。该系统允许应用程序员有效地开发和共享用于显示包括重叠视图和半透明视图的多个复合视图的软件。
文档编号G09G5/36GK1119046SQ94191399
公开日1996年3月20日 申请日期1994年1月3日 优先权日1993年8月30日
发明者里查德·D·韦伯, 阿瑟·W·卡贝拉 申请人:塔里根特公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1