1、优先级高的图段覆盖与之重叠的优先级低的图段。 醒目性。该性质说明该图段在画面中是否要用色彩、光强、闪烁等方式予以强调显示,以引起视觉的格外注意。 变换矩阵。图段首先做该变换矩阵定义的变换,然后再在画面上显示。图形软件包通常规定,用户只有对图段才能施行指定的变换,而不能直接对输出图元施行变换。7.1.2 图段操作图段的操作分为3类,即图段的建立、图段的修改和图段性质的定义。1. 图段的建立图段的建立过程包括三步,即创建一个图段、向这个图段中装入基元和关闭该图段。具体形式是,图形系统提供一个图段括号,凡在图段括号中的输出基元都自动链接到该图段的基元线性表中。在同一时刻,只允许打开一个图段,另一个图
2、段的使用必须等待前一图段被关闭之后。图段括号的命令是: create_segment (Id); close_segment。命令的功能是创建一个名为Id的图段并打开。执行该命令的时候,图形系统创建一个图段头,填入Id,并在图段性质中填入缺省值。此时,图段头中指向图段体的指针值为Null。命令的功能是关闭该图段。例如,下述命令序列:creat_segment (a);polyline (n1, x1, y1);polyline (n2, x2, y2);text (xt, yt, “string”);close_segment:定义了一个名为a的图段,它包括三个基元polyline1、poly
3、line2和text。2. 图段的修改图段的修改包括下列两条命令。 delete_segment (Id)该命令的功能是删除名为Id的图段。当一个图段被删除之后,它的名字可以被新的图段所使用。删除一个图段的实际操作是释放该图段所占的所有内存空间。 rename_segmengt (Id_old, Id_new)该命令的功能是修改图段的名称Id,将它从Id_old改为Id_new。3. 定义图段的性质这类操作包含下列4条命令,分别对图段的4种性质予以操作: set_visibility (Id, v)其中,Id是图段名,v是一二值变量,取值为visible或invisible。值visible定
4、义图段Id为可见,invisible定义该图段为不可见。 set_segment_priority (Id, p)这里,p表示图段Id的优先级,其取值范围是0,1。优先级高的图段可以覆盖优先级低的图段,反之则不能。 set_highlighting (Id, h)参数h定义图段是否要强调显示,取值为Normal或Highlighted。值Highlighted表示该图段在屏幕上以加强或闪烁的色彩显示,这能使该图段在画面中十分醒目。 set_segment_transformation (Id, matrix)其中,matrix为一33的几何变换矩阵,Id是2D图段名。该图段中的各基元在显示之前
5、必须做该变换矩阵定义的变换。与该条命令相对应的是定义3D图段的几何变换的命令:set_segment_transformation _3(Id, matrix)该命令中,图段Id中所含基元的坐标必须是三维的,matrix是44的几何变换矩阵。除此之外,还有另外一些图段操作命令,它们和工作站的概念有关。1. 图段的删除命令为delete_segment_from_workstation(ws, sg)该命令将图段sg从工作站ws中删除。2. 图段的重画redraw_segment_on_workstation(ws)该命令将工作站ws中的所有图段重新画一遍。它常用于工作站删去某图段之后。3. 图
6、段的插入insert_segment(Id, matrix)该命令将WISS中一个图段Id所包含的所有基元,施加由变换矩阵matrix所定义的变换后,插入另外被打开的图段之中。图段Id必须在WISS之中,而且施行变换操作之前已被关闭。被插入的图段可以在任何工作站上,包括WISS。利用该命令,可以将老图段组合为新图段。4. 图段的复制copy_segment_workstation(ws, sg)此命令将WISS中的图段sg复制到工作站ws中去。图段sg必须是WISS中的图段,而且施行变换操作之前已被关闭。ws必须是WDSS型工作站。例如:copy_segment_workstation(Plo
7、tter, Duck)将WISS 中的图段Duck复制到名为Plotter的WDSS型工作站之中去。用复制命令仅将图段sg所包含的基元复制到工作站ws之中,它们在ws中已不再是一个图段,因此不能进行图段操作。 如果希望将WISS之中的一个图段完全复制到WDSS之中,并能在WDSS之中作为一个图段操作,则应使用下述复制命令:associate_segment_with_workstation(ws, sg)其中参数ws和sg的含义及要求与copy命令完全相同。所不同的只是,图段sg完全从WISS中复制到WDSS之中,并可在其中作为一个名称相同的图段进行操作。7.1.3 图段存储器和图形元文件图形
8、软件对逻辑工作站的输入输出操作,实质上是对图形外部设备的缓冲存储器中的数据的操作。所谓多重工作站的概念,就是图形软件能同时处理多个外部设备的缓冲存储器。这种与某个图形外部设备相对应的缓冲存储器,称为与工作站有关的图段存储器(Workstation Dependent Segment Storage),简称WDSS。将图段直接画到WDSS中去有时并不合适,例如对于绘图机,往往希望将画面完全修改、变换妥帖之后一次绘制成正式图。为此,图形软件需要一个独立于工作站的图段存储器(Workstation Independent Segment Storage),简称WISS。WISS可以大大增加使用时的灵
9、活性。从图形软件的角度看,WISS可以看作一个特殊的工作站。软/硬件安装手册提供一个特殊的工作站类型作为WISS。WISS是一块不能与硬件设备直接通信的内存区域。画入WISS中的图段可以通过图段操作命令复制到其他类型的工作站中去。图形元文件(metafile)是图形信息的长期存储文件。和WISS一样,metafile也可以作为一种特殊类型的工作站来处理。图形元文件不仅用于长期存储文件,而且也是图形软件和其他软件之间的数据接口。因此,国际标准化组织研究制订了图形元文件的标准数据格式,以便图形元文件的共享。7.2 结 构7.2.1 基本结构函数当我们创建结构时,结构的坐标位置和属性值就存储在称为中
10、心结构存储器的系统结构表的一个标识组中。创建结构的函数是:openStructure (id)参数id为该结构的标识符,在PHIGS+中,我们可以用字符串标识结构而不用整数名,这样使结构标识符更容易记忆。在加入了所有的图元和属性之后,用closeStructure语句结束结构定义。例如,下列语句将结构6定义为特定线型和颜色的折线:openStructurre (6); setLinetype (lt); setPolylineColourIndex (lc); polyline (n, pts); closeStructure;在一个图形中可以创建任意数目的结构,但是在创建的过程中一次只能打开
11、一个结构。在一个新的结构创建之前,任何打开的结构必须关闭,所以在closeStructure语句中不需要指定结构标识符。一旦创建了结构,就可以用函数postStructure (ws, id, priority)在输出设备上显示。其中,参数ws为工作站标识符,id为结构名,priority为相对于其他结构的显示优先级,取值范围在0到1之间的实数。当两个结构在输出时相互重叠,则优先级高的结构覆盖优先级低的结构。如果两个结构的优先级相同,则最新输出的结构显示在前面。当一个结构输出到一个活动的工作站时,结构中的图元被扫描和解释后在输出设备上显示。扫描结构表并且将图形输出到工作站称为遍历。存储图元的当
12、前属性值的数据结构称为遍历状态表。当送显的结构发生变化时,则系统结构表和导通状态表随之改变。因此,可以自动改变工作站上的送显结构的显示。要使结构不在输出设备上显示,调用函数:unpostStructure (ws, id)这样,就从输出设备的激活结构表中删除了结构,但是系统结构表不受影响。在光栅系统中要使一个结构不再显示,则用背景颜色重画屏幕上的图元。这样处理会影响与删除结构有重叠的其他结构的图元显示。为了避免这一点,我们用场景中不同结构的坐标范围来判断哪些与正在删除的结构相重叠,在删除结构后只要重画这些有重叠的结构即可。用下述函数可以将所有的结构从输出设备中删除:unpostAllStruc
13、ture (ws)如果我们要从系统结构表中删除某一结构,调用函数deleteStructure (id)这样也使结构不再在输出设备上显示。一旦结构被删除,结构的名称就可以被其他图元集使用。清除整个系统结构表的函数是:deleteAllStructures有时重新标识一个结构非常有用,这可以通过调用下列函数来实现:changeStructureIdentifier (oldID, newID)改变结构标识的一个原因是在删除结构后要统一结构的编号,另一个原因是为了测试结构的定位而要在多处显示结构,要在显示中循环地使用结构标识。7.2.2 设置结构属性结构的显示属性有可见性、醒目性和可拾取性,我们可
14、以用工作站过滤器来设置结构的显示属性。在一个特定工作站上,结构的可见与不可见用函数:setInvisibilityFilter (ws, deviceCode, invisSet, visSet)设定,其中参数invisSet包括不可见的结构名,visSet包括可见的结构名。用不可见过滤器可对工作站上的结构进行开关显示,不需将结构真正地从工作站表中删除。因此,可以首先看到一个建筑物的外部轮廓而不了解所有内部的细节,然后,使可见性复位从而看见建筑物的所有细节部分。我们还要指定两个集合中结构的数目。在光栅扫描显示器上,用删除和不删除方法也可以使结构不可见,二者的差别在于:不输出方法并不需要从设备的
15、结构表中删除。醒目性是另一个方便的结构属性。在显示地图时,我们可以对人口低于某一值的所有城市用高亮度显示;或者在地表设计时高亮度显示灌木丛;或者在电路图中高亮度显示一定电压范围内的所有元件。设置醒目性的函数是:setHighlightingFilter (ws, deviceCode, highlightSet, nohighlightSet)参数 highlightSet包含醒目显示的结构名,参数nohighlightSet包含未醒目显示的结构名。用来突出结构的醒目类型取决于图形系统的类型和能力。彩色显示器可以用更强的白色或者用保留彩色显示醒目的结构。另一种实现醒目的方法是:快速开关可见性,
16、使有关结构闪烁显示。闪烁也可以通过对醒目结构在高低值之间快速切换来完成。结构的第三个属性是可拾取性(pickability),即当屏幕光标置于对象上时,可以选取结构。如果要使某一结构在显示时不可拾取,则用可拾取性过滤器将其声明为不可拾取。7.2.3 编辑结构在创建和关闭一个结构后,最常见的操作是修改结构。例如,在设计时为了尝试不同的图形布局,或者要获得新的测试数据而改变设计配置,都要修改结构。如果向结构中加入图元,只要用openStructure函数重新打开结构并加入需要的语句。作为一个简单的例子,下列程序首先创建一个填充区域的结构,然后向结构中加入第二个填充区域。openStructure
17、(shape); setInteriorStyle (solide); setInteriorColourIndex (4);closeStructure; setInteriorStyle (hollow); fillArea(n2, verts2); 该操作序列等同于初始化时就创建两个填充区域:setInteriorStyle (solide);setInteriorColourIndex (4);fillArea( n1, verts1);setInteriorStyle (hollow);fillArea (n2, verts2);除了添加操作之外,有时也希望删除结构中的某一项,或者改
18、变图元和属性设置,或者在结构中的指定位置插入某些项。这些编辑操作通过访问结构中某个部分的序列号并设置编辑模式来完成。1. 结构表和元素指针结构中的一个项,如输出图元和属性值称为结构元素,简称元素。当元素进入结构时都配有参照位置。图7.2给出了下列程序段创建的结构元素和相关位置号的存储。openStructure (gizmo);setLinetype (lt1);setPolylineColourIndex (lc1);polyline (n1, pts1);setLinetype (lt2);setPolylineColourIndex (lc2);polyline (n2, pts2);结
19、构元素用从1开始的整数连续编号,0指向第一个元素的前一个位置。打开结构时,设置元素指针,使其指向某一位置以便编辑结构。如果打开一个新的结构(系统结构表中所没有的),元素指针置0。如果打开的结构已经在系统表中存在,元素指针指向结构的最后一个元素位置。当向结构中加入元素时,元素指针加1。0 gizmo structuresetLinetype(lt1)setPolylineColourIndex (lc1)polyline (n1, pts1)setLinetype (lt2)setPolylineColourIndex (lc2)polyline (n2, pts2)1 2 3 4 5 元素指针
20、 6 图7.2 结构gizmo的元素位置用函数setElementPointer (k)可以将元素指针置为任意位置。其中,参数k可以是从0到结构最大元素号之间的任意整数。利用偏移函数offsetElementPointer (dk)可以相对于当前位置移动指针。其中,dk为正负整数偏移量。一旦我们将元素指针置于某一位置,就可以在该位置编辑结构。2. 设置编辑模式结构可以用一种或两种模式来修改,称为结构的编辑模式。用下列函数设置编辑模式的值:setEditMode (mode)其中,参数mode设定为插入(insert)或替代(replace)。3. 插入结构元素当编辑模式置为插入时,进入结构的下
21、一项被放在元素指针的后一位置。在插入项后面的元素自动重新编号。为了说明插入操作,我们改变结构gizmo中的标准线宽,将线宽命令插入到折线绘制命令之前,修改后的程序段如下:setEditMode (insert);setElementPointer(0);setLineWidth (lw);图7.3为上述插入操作后修改了的gizmo元素表。插入后元素指针置为1(新线宽的属性位置),在线宽语句后所有元素都重新编号,即从2开始。SetLineWidth (lw)Polyline (n1, pts1)Polyline (n2, pts2)元素指针 1 234567图7.3 向结构gizmo中插入线宽属
22、性后,修改过的元素表和元素指针的位置在创建新结构时,编辑模式自动置为插入。假定在重新打开这个结构前编辑模式没有改变,可以在元素表的末端加入新项,不用设置编辑模式或元素指针,这是因为编辑模式保存了插入值和指向打开结构中列表的最后元素的指针。4. 替代结构元素当编辑模式设为替代时,进入结构的下一项放在元素指针的位置,原来位置上的元素就被删除,元素的指针保持不变。作为替代操作的例子,假设我们要改变结构gizmo中第二个折线的颜色,可以执行下列语句:setEditMode (replace);setElementPointer(5);setPolylineColourIndex (lc2New);图7
23、.4是修改后结构gizmo的元素表,其中第二条折线为新的颜色。在替代操作之后,元素指针保持在位置5(新的折线颜色属性位置)处。setPolylineColourIndex (lc2New)元素指针 5 6 图7.4 改变第二条折线的颜色后,修改过的结构gizmo的元素表和元素指针的位置5. 删除结构元素调用函数:deleteElement可将指针指向的当前位置上的元素从结构中删除,并且元素指针指向前一个元素。例如要使结构gizmo中的两折线有同一种颜色,只要删除第二个颜色属性就可以实现:deleteElement;删除之后,元素指针置为4,后续所有元素重新编号,结果如图7.5所示。连续删除结构
24、元素组可调用函数:deleteElementRange (k1, k2)其中,参数k1为起始位置序号,k2为结束位置序号。例如,执行下面的语句:deleteElementRange (4, 6)将删除结构gizmo中第二个折线和相关的属性。元素指针4 图7.5 在结构gizmo中删除第二条折线的颜色属性后,修改过的的元素表和元素指针的位置如果要删除一个结构中的所有元素,调用函数:emptyStructure (id)6. 标识结构元素如果对结构做一系列的修改,将不容易跟踪元素的位置。删除和插入元素改变了元素的位置号。为了在修改时避免一直保存新的位置号,调用函数:label (k)标识结构中的不
25、同元素。其中,参数k是位置的整数标识符。标识可以插入结构表中的任何位置,它帮助找出结构元素而无需参照位置号。标识函数创建结构元素但是不影响结构的遍历处理。我们简单地使用存储在结构中的标识作为编辑参考而不用单独的元素位置。结构元素的标识不必惟一,有时让两个或者多个元素有同一个标识值,这对结构中多个位置有同样的编辑操作是很方便的。为了说明标识的使用,执行下列语句创建结构labeledGizmo,其元素和位置号如图7.6所示。0 labeledGizmo structurelabel (object1Linetype)label (object1Color)SetPolylineColourIndex (lc1)label (object1)label (object2Linetype)label (object2Color)label (object2)7 8 9 10 11 元素指针 12 图7.6 在结构labeledGizmo中的元素位置openStructure (labeledGizmo);label (object1Linetype);label (object1Color);label (object1);label (object2Linetype);label
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1