您好,欢迎访问三七文档
图形的层次结构现实世界中的客观对象都有一定的组织结构,用图形学来描绘实际的对象需要确定一定的图形结构(几何模型几何模型几何模型几何模型)现实中的对象往往有层次结构,描述这些对象的几何模型也具有层次结构的几何模型也具有层次结构利用层次结构,可以方便地对图形进行编辑和绘制本章给出了几种常见的图形层次结构几种常见的图形层次结构几种常见的图形层次结构几种常见的图形层次结构,,,,包括包括包括包括PHIGSPHIGSPHIGSPHIGS结构和许多应用系统中常用的面向对象的结构和许多应用系统中常用的面向对象的结构和许多应用系统中常用的面向对象的结构和许多应用系统中常用的面向对象的层次结构层次结构层次结构层次结构。。。。5.1图形的层次结构概述图形结构也称为几何模型,是由有明确定义的几何元素,如点、线、面等及其相互间连接关系组成。基本图素基本图素点、线、面等称为基本图素/图元,基本图素之间的连接关系称为拓扑关系。在层次结构中,由基本元素构成的对象可用来构成更复杂的对象,这类对象也称为基本元素。图形层次结构的组成部分几何及其附属属性物体及组成物体的基本元素的几何属性和其他影响外表的属性,如颜色、线形和线宽等。拓扑关系基本元素之间的连接关系,拓扑关系可以用树结构或基本元素之间的连接关系,拓扑关系可以用树结构或邻接矩阵表示,也可由其内在的几何定义表示。特定的属性,如速度、温度等。与物体及基本元素相对应的数据值和属性,如电子文本和描述文字。自底向上的设计方法图形结构常常是层次的计算机硬件结构图是由很多诸如运算器、控制器及存储器部件等部件组成的,每一部件又由一些标准的单元电路、门电路及触发器组成。图形设计时,往往用自底向上的方法设计复杂的层次结构图首先由基本的图形元素如线、圆弧等构建形成门、窗和楼梯(高一层的图素),再由直线段、圆弧等基本元素和门、窗、楼梯等高一层的图素形成房间和层等更高一层的结构,最后组成一栋楼房,这些高层图素一般称为块块块块(block)(block)(block)(block)或子图或子图或子图或子图。只要在图形结构中存在结构相同的部分,而这些部分又在图形结构中出现多次,就可把这样的部分组成块。在该结构中,与门、非门及或门电路是基本电路,分别由不同的基本图素线段及圆弧构成。可把与门、非门及或门组织成三个块块块块,任何逻辑图便可利用这三个块和基本元素根据实际组合来构成。实例:逻辑电路图设计中的层次结构任何逻辑图便可利用这三个块和基本元素根据实际组合来构成。同一个块可以有不同的实例实例实例实例,这些实例在图中的位置,大小和方向都可以不同。这些门电路可以组成一些基本电路块基本电路块基本电路块基本电路块(如触发器),而逻辑电路又由这些基本电路块及门电路块组成,这样便形成了一个多层的层次结构。与非与或图由门电路组成的逻辑电路利用了层次结构最主要的好处是可以将一组相关的图素组织在一起,进行整体的插入、删除、移动和放缩等操作。((((编辑编辑编辑编辑))))层次结构的优点删除、移动和放缩等操作。((((编辑编辑编辑编辑))))由于在图中一个块虽在图中多处出现,但它的几何及拓扑信息是相同的,因此只需保存一次,所以可以节省大量的内存。(存储存储存储存储)利用面向对象的程序设计类的继承特性,可以很好地实现图形的层次结构。通过对已有对象进行增加或部分修改的方法建立新的对象,对已有对象可以增加数据和过程,也可以对其中某些过程进5.25.25.25.2面向对象的层次结构的实现面向对象的层次结构的实现面向对象的层次结构的实现面向对象的层次结构的实现对已有对象可以增加数据和过程,也可以对其中某些过程进行重新定义。最初的类被称为基类,从基类扩展出来的类称为派生类。这样采用对象派生的方法可以建立一个有层次的对外部世界的描述5.2.15.2.15.2.15.2.1面向对象的层次结构表示面向对象的层次结构表示面向对象的层次结构表示面向对象的层次结构表示将结构中的基本图素定义为类,并定义相应的数据和方法来实现基本图素,基本图素的类又可以通过对其增加和更新形成更高一层的图形部件classElement{UINTnType;voiddraw();booleanselect(x,y);voidmodify();用类Line,Circle…等来描述直线段、圆弧等基本图形元素,它们是构成voidmodify();voiddelete();voidsetColor(intcolor);intgetColor();}classLine:publicElement{floatx0,y0,x1,y1;voiddraw(){….}}classCirclepublicElement{floatxc,yc,xs,ys,xe,ye;voiddraw(){….}}层次结构中块的最基本的元素。可以将OpenGL的函数嵌入以实现Line类的draw()函数。voiddraw(){glBegin(GL_LINES);glVertex2f(x0,y0);glVertex2f(x1,y1);glEnd();}图形结构块图形结构块图形结构块图形结构块图形结构块classBlockpublicElement{char*name;CElement**eList;Block*next;voiddraw(){….}}图形结构块是由多个直线段、圆弧等基本图形元素和多个块的实例组成的,由基本元素和块实例形成的块又可以借助于块实例成为高层块的组成部分,形成一个嵌套结构,当然最底层的块只能由基本图形元素组成。eList用来保存构成块的所有基本图形元素和块实例的对象指针,它可以是一个动态数组,也可以用链表等线性表结构实现。绘制图块时,遍历线性表中的所有对象,调用对象的draw()方法就可以完成整个块的绘制。类Block中的name用来保存块的名字,可用于标识块,当然也可以根据具体的应用附加其他的属性进行扩充。next指针指向下一个块结构,通过它可以将该块及块中所涉及子块连接在一起。块的实例块的实例块的实例块的实例块的实例classInstancepublicElement{Block*pt;floatdx,dy,rax,ray,sx,sy;}把块的实例放在图中(所在的高层的块)的不同位置,这相对于世界坐标系来讲是一个平移变换;同一个块在不同位置的实例其大小、方向和位置可以不同;因此要在世界坐标变换基础上作一个局部的变换。块的实例一般把块的中心放在坐标原点,通过局部变换产生放在不同位置及不同大小方向的实例通过局部变换产生放在不同位置及不同大小方向在类Instance中我们分别用dx,dy,rax,ray,sx,sy表示变换的参数,用于描述实例实际的位置、大小和旋转角度。。。。块的实例这里并不要求专门建立局部坐标系的变换,我们还是可以用世界坐标中的变换来实现。在OpenGL中世界坐标系的二维变换为:glScale(sx,sy,0,0)//在x、y方向分别放缩sx及sy倍glRotate(rax,ray,0,0)//旋转ra角gltranslate(dx,dy,0,0)//在x、y方向分别平移dx、dy5.2.2面向对象的层次结构编辑图形块的存取操作用命令Block*createBlock(name)创建一个名为name值的新图形块;用Block*openBlock(name)打开一个已存在的图形块;用closeBlock(name)关闭当前打开的图形块;用booldeleteBlock(name)删除名为name的图形块。5.2.2面向对象的层次结构编辑图形块的编辑操作增加图素。add(newLine(x0,y0,x1,y1))//增加一条新的直线选择图素。Select(x,y)在图形块中找出被选择的对象修改和删除操作优点:5.2.35.2.35.2.35.2.3面向对象的层次结构的讨论面向对象的层次结构的讨论面向对象的层次结构的讨论面向对象的层次结构的讨论1)存储、修改、显示、编辑等可以用统一的方法来处理。2)采用面向对象的设计,易于扩充,可以很方便地支持其他的基本图形元素。3)用过程和数据结合来灵活地表示层次结构的复杂图形。5.2.35.2.35.2.35.2.3面向对象的层次结构的讨论面向对象的层次结构的讨论面向对象的层次结构的讨论面向对象的层次结构的讨论•由于面向对象的图形层次结构从存储结构上支持图形块的循环嵌套,因此在图形的显示、遍历等操作时有可能陷入死循环。•但实际的图形结构是不可能出现循环嵌套的,这就要求在实现将图形块实例插入时,的,这就要求在实现将图形块实例插入时,要进行必要的检查,避免出现循环嵌套。•下面实例给出了一个具体的层次表示5.2.35.2.35.2.35.2.3面向对象的层次结构的讨论面向对象的层次结构的讨论面向对象的层次结构的讨论面向对象的层次结构的讨论elist[o](line)elist[o](line)elist[o](line)elist[o](line)elist[o](line)elist[1](line)elist[2](line)elist[3](circle)elist[1](line)elist[13](line)nextnext......elist[o](line)elist[1](line)elist[2](line)elist[3](circle)nextelist[0](circle)elist[1](curve)nextelist[o](line)elist[1](line)elist[2](line)next(null)逻辑电路的层次表示ISO1986年公布的计算机图形系统标准PHIGS(Programmer’sHierarchicalInteractiveGraphicsSystem)提供实现图形层次结构的结构方法。5.35.35.35.3用结构方法实现层次结构用结构方法实现层次结构用结构方法实现层次结构用结构方法实现层次结构构方法。在PHIGS中,赋于标号的一系列输入图元(包括有关特性)称为结构。5.3.1基本的结构函数建立一个新的结构的过程openStructure(id);id为整数,将id赋予这个结构作为标号定义图形的属性及绘制图形用closeStructure关闭这个结构实例下列程序定义了一个标号为6的绘制多边形的结构。openStructure(6)openStructure(6)openStructure(6)openStructure(6);;;;setLinetype(lt)setLinetype(lt)setLinetype(lt)setLinetype(lt);;;;setPolylineColorIndex(lc)setPolylineColorIndex(lc)setPolylineColorIndex(lc)setPolylineColorIndex(lc);;;;polyline(npolyline(npolyline(npolyline(n,,,,pts)pts)pts)pts);;;;closeStructurecloseStructurecloseStructurecloseStructure;5.3.1基本的结构函数元素元素元素元素::::一个结构中,介于openStructure及closeStructure二命令中的属性设置及图形输出命令称为元素。元素以先后次序从1开始有个编号。有个编号。1SetLinetype(lt)2SetPolylineColourIndex(lc);3Polyline(n,pts);元素指针元素表5.3.1基本的结构函数postStructure(wspostStructure(wspostStructure(wspostStructure(ws,,,,idididid,,,,priority)priority)priority)priority)在工作站ws上显
本文标题:图形的层次结构
链接地址:https://www.777doc.com/doc-6197476 .html