5图形的层次结构

上传人:飞*** 文档编号:51487335 上传时间:2018-08-14 格式:PPT 页数:34 大小:1.10MB
返回 下载 相关 举报
5图形的层次结构_第1页
第1页 / 共34页
5图形的层次结构_第2页
第2页 / 共34页
5图形的层次结构_第3页
第3页 / 共34页
5图形的层次结构_第4页
第4页 / 共34页
5图形的层次结构_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《5图形的层次结构》由会员分享,可在线阅读,更多相关《5图形的层次结构(34页珍藏版)》请在金锄头文库上搜索。

1、五 图形的层次结构 现实世界中的客观对象都有一定的组织结构,用图形学来描绘实际的对象需要确定一定的图形结构(几何模型) 现实中的对象往往有层次结构,描述这些对象的图形结构也是层次的 利用层次结构,可以方便地对图形进行编辑和绘制 本章给出了几种常见的图形层次结构,包括 PHIGS结构和许多应用系统中常用的面向对象的 层次结构。 5.1 图形的层次结构概述基本概念: 图形结构v也称为几何模型,是由具有明确几何定义的元素,如点、线、面等 及其相互间连接关系组成。 基本图素v点、线、面等称为基本图素/图元,v基本图素之间的连接关系称为拓扑关系。v在层次结构中,由基本元素构成的对象可用来构成更复杂的对象

2、, 这类对象也称为基本元素。图形层次结构的组成部分几何及其他附属属性物体及组成物体的基本元素的几何属性和其他影响外 表 的属性,如颜色、线形和线宽等。 拓扑关系 物体及基本元素之间的拓扑关系,拓扑关系可以用树 结构或邻接矩阵表示,也可由其内在的几何定义表示 。 特定的图形结构,用来表示一些特定的属性。 与物体及基本元素相对应的数据值和属性,如电子文本和描 述文字。自底向上的设计方法 图形结构常常是层次的 计算机硬件结构图是由很多诸如运算器、控制器及存储器部件等部件组成的,每一部件又由一些标准的单元电路、门电路及触发器组成。 图形设计时,往往用自底向上的方法设计复杂的层次结构图 首先由基本的图形

3、元素如线、圆弧等构建形成门、窗和楼梯(高一层的图素), 再由直线段、圆弧等基本元素和门、窗、楼梯等高一层的图素形成房间和层等更高一层的结构, 最后组成一栋楼房, 这些高层图素一般称为块(block)或子图。 只要在图形结构中存在结构相同的部分,而这些部分又在图形结构中出现多次,就可把这样的部分组成块。 在该结构中,与门、非门及或门电路是基本电路,分别由不同的基本图素 线段及圆弧构成。 可把与门、非门及或门组织成三个块, 任何逻辑图便可利用这三个块和基本元素根据实际组合来构成。 同一个块可以有不同的实例,这些实例在图中的位置,大小和方向都可以不 同。 这些门电路可以组成一些基本电路块(如触发器)

4、,而逻辑电路又由这些基 本电路块及门电路块组成,这样便形成了一个多层的层次结构。图5.1 由门电路组成的逻辑电路实例:逻辑电路图设计中的层次结构实例与或非与 利用了层次结构最主要的好处是可以将一组相关的图素组织在一起,进行整体的插入、删除、移动和放缩等操作。层次结构的优点 由于在图中一个块虽在图中多处出现,但它的几何及拓扑信息是相同的,因此只需保存一次,所以可以节省大量的内存。 利用面向对象的程序设计类的继承特性,可以很好地实现图形的层次结构,下面讨论层次结构的具体表示和相关的操作。 通过对已有对象进行增加或部分修改的方法建立新的对象,对已有对象可以增加数据和过程,也可以对其中某些过程进行从新

5、定义。 最初的类被称为基类,从基类扩展出来的类称为派生类。 这样,我们可以采用对象派生的方法建立一个有层次的对外部世界的描述 5.2 面向对象的层次结构的实现5.2.1 面向对象的层次结构表示将结构中的基本图素定义为类,并定义相应的 数据和方法来实现基本图素,基本图素的类又可以 通过对其增加和更新形成更高一层的图形部件class Element UINT nType;void draw(); boolean select(x,y); modify(); delete();void setColor(int color);int getColor(); class Line: public El

6、ementfloat x0, y0, x1, y1;void draw(). class Circle public Element float xc, yc, xs, ys, xe, ye;void draw(). 用类Line, Circle 等 来描述直线段、圆弧等基 本图形元素,它们是构成 层次结构中块的最基本的 元素。可以将OpenGL的函 数嵌入以实现Line类的 draw()函数。void draw()glBegin(GL_LINES); glVertex2f (x0,y0); glVertex2f (x1,y1);glEnd(); 图形结构块2. 图形结构块class Bloc

7、k public Element char * name; CElement *eList;Block *next;void draw(). 图形结构块是由多个直线段、圆弧等基本图形元素和多个块的实例组成 的,由基本元素和块实例形成的块又可以借助于块实例成为高层块的组成 部分,形成一个嵌套结构,当然最底层的块只能由基本图形元素组成。 eList用来保存构成块的所有基本图形元素和块实例的对象指针,它可以 是一个动态数组,也可以用链表等线性表结构实现。绘制图块时,遍历线性 表中的所有对象,调用对象的draw()方法就可以完成整个块的绘制。 类Block中的name用来保存块的名字,可用于标识块,当

8、然也可以根据具体 的应用附加其他的属性进行扩充。 next指针指向下一个块结构,通过它可以将该块及块中所涉及子块连接在一 起。块的实例3. 块的实例class Instance public ElementBlock *pt; float dx, dy, rax,ray, sx, sy;把块的实例放在图中(所在的高层的块)的不同位置,这相对于 世界坐标系来讲是一个平移变换;同一个块在不同位置的实例其大小、方向和位置可以不同;因此要在世界坐标变换基础上作一个局部的变换,这种局部变 换就是我们第四章讲的变换。块的实例一般把块的中心放在坐标原点,通过局部变 换产生放在不同位置及不同大小方向的实例图5

9、.2 通过局部变换产生放在不同位置及不同大小方向在类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、dy 5.2.2 面向对象的层次结构编辑图形块的存取操作v 用命令Block * crea

10、teBlock(name)创建一个名 为name值的新图形块;v 用Block * openBlock(name)打开一个已存在 的图形块;v 用closeBlock(name)关闭当前打开的图 形块; v 用bool deleteBlock(name)删除名为 name的图形块。5.2.2 面向对象的层次结构编辑 图形块的编辑操作v增加图素。add(new Line(x0,y0,x1,y1) /增加一条新的直线v 选择图素。Select(x,y) 在图形块中找出被选择的对象v 修改和删除操作优点:5.2.3面向对象的层次结构的讨论1)同一层的块结构是相同的,不同层的结构用 统一的Block来

11、表示,存储、修改、显示、编辑等可以用统一的方法来处理。2)采用面向对象的设计,易于扩充,可以很 方便地支持其他的基本图形元素。3)用过程和数据结合来灵活地表示层次结构的复杂图形。5.2.3面向对象的层次结构的讨论由于面向对象的图形层次结构从存储结构 上支持图形块的循环嵌套,因此在图形的显 示、遍历等操作时有可能陷入死循环。但实 际的图形结构是不可能出现循环嵌套的,这 就要求在实现将图形块实例插入时,要进行 必要的检查,避免出现循环嵌套。下面结合 实例给出了一个具体的层次表示5.2.3面向对象的层次结构的讨论图5.3 逻辑电路5.1的层次表示 ISO 1986年公布的计算机图形系统标准PHIGS

12、 (Programmers Hierarchical Interactive Graphics System)提供实现图形层次结构的结 构方法。 在PHIGS中,赋于标号的一系列输入图元(包 括有关特性)称为结构。5.3 用结构方法实现层次结构5.3.1 基本的结构函数建立一个新的结构的过程 openStructure(id);id为整数,将id 赋予这个结构作为标号 定义图形的属性及绘制图形 用closeStructure 关闭这个结构实例下列程序定义了一个标号为6的绘制多边形 的结构。openStructure(6);setLinetype(lt);setPolylineColorInde

13、x(lc);polyline(n,pts);closeStructure;5.3.1 基本的结构函数元素:一个结构中,介于openStructure及 closeStructure二命令中的属性设置及图形输出 命令称为元素。元素以先后次序从1开始有个 编号。1SetLinetype(lt)2SetPolylineColourIndex(lc);3Polyline(n, pts);元素指针图5.4 元素表5.3.1 基本的结构函数 postStructure(ws,id,priority)v 在工作站ws上显示标号为id的结构。v priority是显示的优先级,在0,1中取值。v 当两个结构在

14、显示屏上重叠时,在重叠处显示优先级大的结构。v 工作站ws可以是显示器或激光打印机等图形输出设备。 unpostStructure(ws,id)v 使结构在显示器工作站ws上不显示v 从输出设备的激活机构表中删除了结构,但并不影响系统结构表。v 在光栅系统中要使一个结构不再显示,则用背景色重画屏幕上的图元即可。但是这样处理会影响到与被删除结构有重叠的其他结构图元的显示。为了避免这一点,可以用场景中不同结构的坐标范围来判断哪些结构与要被删除的结构重叠,在删除结构之后只要重画这些有重叠的结构就可以。5.3.1 基本的结构函数 changeStructureIdentifier(oldID, new

15、ID);v重新标识一个结构 unpostAllStructures(ws);v将所有的结构从工作站ws的输出设备中删除: deleteStructure(id)v要删掉一个结构,v一旦结构id被删除后,所有工作站就都不能显示该结构了。此后,该结构的名字可以被其他图形结构使用。 deleteAllStructures;v清除整个系统结构表:5.3.2 设置结构属性setInvisibilityFilter(ws,devCode, invisSet, visSet) vinvisSet包括不可见的结构名, vvisSet包括可见的结构名。 v不可见过滤器对于工作站上的结构起了开关显示的作用 ,因此

16、不用将结构真正的从工作站表中删除。setHighlightingFilter(ws,devCode,highlightSet,nohigh lightSet) vhighlightSet包括需要高亮度显示的结构名, vnohighlightSet包括不用高亮度显示的结构名。5.3.3 结构编辑如果需要在建立一个新的结构的元素后添加另外 一些新的元素,只要再调用openStructure及 closeStructure,并把要添加的元素写在它们中间即可 。openStructure(shape); setInteriorStyle(solid); setInteriorColourIndex(4) ; fillArea(n,verts1); closeS

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号