一种无向图或有向有圈图的层次化显示方法

文档序号:6632845阅读:594来源:国知局
一种无向图或有向有圈图的层次化显示方法
【专利摘要】本发明提供了一种无向图或有向有圈图的层次化显示方法,包括:(1)创建无向图或有向有圈图的起点;(2)读入数据文件,根据三元组数据文件构建无向图或有向有圈图中所有的模型节点和有向线段,形成无向图或有向有圈图的内部模型;(3)初始化,将节点数据对象的搜索标志设置为未搜索;(4)对无向图或有向有圈图的模型进行宽度优先搜索并显示;(5)扩展处理,对静态关系图进行扩展处理,使之能动态显示当前节点的相连节点或当前节点的展开节点。本发明方法可以用计算机系统中常用的树窗口来显示复杂的无向图或有向有圈图,可以降低计算机无向图或有向有圈图的开发难度,避免进行无向图或有向有圈图的复杂布局运算。
【专利说明】—种无向图或有向有圈图的层次化显示方法

【技术领域】
[0001]本发明属于计算机图形化【技术领域】,更具体地,涉及一种无向图或有向有圈图的层次化显示方法,用于将二维的无向图或有向有圈图用计算机系统中常用的树状显示软件显示出来。

【背景技术】
[0002]图论是解决复杂工程问题常用的数学理论和工具。无向图是图论中最基本的图,其特点是:用节点和节点之间的连线表示复杂工程问题的拓扑关系,通过对图的分析和求解来完成工程问题的求解。
[0003]图论是求解问题的强大工具。当许多问题采用简单的节点和连线表示时常常变得比较容易解决,这是因为用这些简单的节点和连线既可以简单地表示问题,同时也能反映问题的本质。事实上,图论应用极其广泛,大多数的计算机应用问题都用图来表示。因此,在使用图论解决复杂问题时,首先必须绘制出以二维或多维形式(一般采用二维图形)表示的问题,然后通过对其进行分析、综合而获得问题的解决。
[0004]在一张图中,如果任何两个节点之间的连线都是从起点到终点的有向线段或弧,则称该图为有向图,如果任何两个节点的连线都是无箭头的线段或弧,则称该图为无向图。无向图可以用有向图来表示,即用两根箭头相反的有向线段或弧来连接任何两个节点。显然,有向图的表示范围更大,即无向图是有向图的特例,而且这种有向图是有圈的,即无向图是一种特殊的有向有圈图。由于在下面的讨论中,无向图或有向有圈图的处理方法相同,所以简单地用无向图表示无向图或有向有圈图。
[0005]在图论中,无向图一般用两种图形兀件表不,一种是节点,通常用一个空心或实心的小圆点或圆框表示;另一种是边,通常用两个节点之间的线段或弧来表示。
[0006]虽然图论的能力很强,但在使用图论求解时,并不像其他数学工具一样必须严格遵守书写规范,对图形的绘制比较随意,只要能反映出被求解问题的内在关系即可。例如,图1是表示哈密顿提出的20个城市的环球航海问题的哈密顿圈表示,图2是一个非哈密顿圈问题的表示,在图1和图2中线段的长度和位置并没有严格的限制,甚至可以绘制一个与之相差很大的图形,但只要节点和连线之间的关系不变,则表达的问题不变。
[0007]当我们应用计算机系统进行图论问题求解时,如果也能在计算机系统中用二维图表示无向图则效果非常好,但是会存在以下问题:
[0008]I)系统开发要求高
[0009]虽然对无向图的绘制精确度没有特殊要求,但绘制无向图仍然需要开发一个二维图形系统。到目前为止,图形系统的开发仍然是一个比较困难的问题,需要投入非常多的人力和物力资源。
[0010]2)图形布局困难
[0011]在很多情况下,无向图的布局对于问题的解决起着非常重要的作用。无向图表示的是节点之间的拓扑关系,由于同一拓扑关系的图形样式非常多,即无向图的构型是很多的,很难自动进行图形的布局。另一方面,无向图可能出现边的交叉,例如非平面图就必然存在交叉线段,如何减少交叉或布置美观是一个非常难以解决的问题。所以对于无向图绘制系统,除了特例外,一般是提供交互工具,让用户自己完成无向图的绘制。
[0012]3)整体感差
[0013]当无向图节点和有向线段的数目比较大时,整个无向图的幅面将变得很大,而计算机显示屏幕是有限的,这样就给使用带来困难。如果观察整幅图,则可能看不清图上的文字信息;如果查看局部图,则很难形成整体印象。
[0014]4)查找比较麻烦
[0015]同样,当无向图中的节点数很大时,虽然可以放大看清文字,但同时可见部分很小,寻找不在当前视图范围内的节点或有向线段时会比较困难。而缩小图面内容时,虽然可以快速地移动无向图,但必须通过放大才能确认需要查找的内容。
[0016]5)图形维护困难
[0017]在无向图的使用过程中,图本身拓扑结构可能发生改变。一般情况下,增加或删除一些节点或有向线段都可能造成图形布局的变化。显然,拓扑结构的变化会破坏图形布局的整齐、美观,甚至不能有效表达逻辑关系,所以当无向图发生变化时需要重新对其布局,以产生良好的效果。显然,对图形布局的改变实际上意味着系统必须重新进行布局运算,其运算量将是比较大的。
[0018]为了克服传统的计算机无向图图形显示方法的缺陷,必须首先对无向图的显示方法进行一些修改,然后采用计算机系统中常用的树窗口对其进行显示,以便能更简便、快键、有效地使用无向图。


【发明内容】

[0019]为了降低现有的无向图或有向有圈图的计算机显示方法的开发难度,方便计算机用户对无向图或有向有圈图的应用和维护,本发明提出一种新的无向图或有向有圈图的层次化显示方法。该方法首先根据工程应用情况在无向图或有向有圈图中设置一个节点为核心点,然后从核心点开始,采用宽度优先搜索方法对无向图或有向有圈图进行分层,形成一个树状结构,并用常用的计算机树窗口加以显示。在树窗口显示的生成过程中,已经在树窗口显示的无向图或有向有圈图的节点不再显示。可以通过对树窗口中树节点的右键消息和双击消息来查看当前节点的关联信息。
[0020]为了实现上述目的,本发明提供了一种无向图或有向有圈图的层次化显示方法,所述方法包括如下步骤:
[0021](I)创建无向图或有向有圈图的起点;
[0022](2)读入数据文件,根据三元组数据文件构建无向图或有向有圈图中所有的模型节点和有向线段,形成无向图或有向有圈图的内部模型;
[0023](3)初始化,将节点数据对象的搜索标志设置为未搜索;
[0024](4)对无向图或有向有圈图的模型进行宽度优先搜索并显示,从核心点或起点开始,一层一层向外搜索并显示每个无向图或有向有圈图的节点,包括如下子步骤:
[0025](4.1)如果当前模型节点标志设置为未搜索,则进入(4.2),否则进入(4.3);
[0026](4.2)获得当前模型节点所有的子模型节点,将其显示在树窗口当前节点对应的树节点的下面作为子节点;这些树窗口的子节点记录它们所对应的模型节点的指针,同时将当前模型节点的标志设置为已扩展,其值为对应树节点的句柄;
[0027](4.3)取得下一个当前层的模型节点,重复(4.1)-(4.3),直到当前层全部模型节点都处理完毕;
[0028](4.4)取得下一层的模型节点,重复(4.1)-(4.4),直到所有模型节点都处理完毕。
[0029]在本发明的一个实施例中,所述步骤(2)具体包括:
[0030]从数据文件中读入无向图或有向有圈图的核心点;
[0031]从数据文件中读入三元组数据,并依据这些数据构建无向图或有向有圈图中所有的模型节点和有向线段,形成无向图或有向有圈图的内部模型;
[0032]数据文件读入后,再将核心点与起点连接起来。
[0033]在本发明的一个实施例中,所述方法还包括:
[0034](5)扩展处理,对静态关系图进行扩展处理,使之能动态显示当前节点的相连节点或当前节点的展开节点;所述扩展处理包括关联节点显示操作或展开节点显示操作,其中:
[0035](5.1)关联节点显示操作:当用户需要观察某一个节点的所有相关联的节点时,将鼠标移到该节点的树节点位置,然后单击鼠标右键弹出一个对话框,显示当前树节点的所有相关联的节点;
[0036](5.2)展开节点显示操作:当用户需要观察某一个节点的展开的子节点情况时,将鼠标移到该节点的树节点位置,然后双击鼠标左键,树窗口自动将当前节点的展开节点作为选择节点;如果展开节点不在当前窗口内,系统将自动移动树并显示该展开节点。
[0037]本发明所带来的有益效果是,所提出的方法可以用计算机系统中常用的树窗口来显示复杂的无向图或有向有圈图,可以降低计算机无向图或有向有圈图的开发难度,避免进行无向图或有向有圈图的复杂布局运算,既清晰地表示了各节点之间的关联关系,可以保留无向图或有向有圈图的拓扑特征,又不会带来图形节点数目的急剧增加。在无向图构建,特别是大规模无向图或有向有圈图构建时,特别简单、不容易出错。

【专利附图】

【附图说明】
[0038]图1是一个20个城市的环球航海问题的哈密顿圈表示无向图;
[0039]图2是一个非哈密顿圈问题的表示无向图;
[0040]图3是本发明中宽度优先搜索流程图;
[0041]图4是对应于图1的无向图的层次化显示图;
[0042]图5是对应于图2的无向图的层次化显示图;
[0043]图6是显示查看图4 一个节点相关联的节点图;
[0044]图7是显示图4中当前树节点双击后的展开节点显示图。

【具体实施方式】
[0045]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
[0046]在本发明中,假定无向图是简单图,而且图本身是正确的,不需要对错误的无向图进行验证,即本发明假定需要绘制的无向图是对具体应用的正确反映,每一个节点、有向线段和与或关系都是正确的。
[0047]本发明假定无向图或有向有圈图的输入采用数据文件定义,即用以下三元组来描述无向图或有向有圈图中的任一条线段E:
[0048]E = (Nin, R, Nout)
[0049]这里,Nin表示E的一个端点;Ntjut表示E的另一个端点;R表示端点Nin和端点Ntjut之间的关系。一条线段只描述一次,两个端点的次序可以交换。为了避免重复输入,可以对节点按照数字进行编号,描述线段时第一个端点号总是小于第二个端点号。
[0050]在输入数据文件中还需要给出核心点号,即用树表示时的根节点号。
[0051 ] 本发明的目标是用计算机应用系统中常用的树窗口表示无向图或有向有圈图,由于它们的名称相同,为了有效地加以区分,下面的论述中在需要区分时称无向图或有向有圈图的节点为模型节点,而称它在树窗口中显示的节点为树节点。
[0052]本发明的主要步骤如下:
[0053]I)创建无向图或有向有圈图的起点
[0054]无向图或有向有圈图本身是没有起点的,但在进行无向图或有向有圈图层次化显示时可以将其看作是一棵树,即存在一个起点或根节点。为了处理方便,本发明首先创建一个起点,该起点是一个虚拟的起点,认为无向图或有向有圈图内所有的节点都是从此出发的。
[0055]2)读入数据文件
[0056]首先,从数据文件中读入无向图或有向有圈图的核心点。根据广义环图树的方法,本发明认为整个无向图或有向有圈图有一个核心,然后从该核心向外依据宽度优先的原则进行一层一层的扩展。从图论的角度来说,该核心点选择没有限制,但根据工程实际需要设定对于问题的分析与解决比较好。
[0057]然后,从数据文件中读入三元组数据,并依据这些数据构建无向图或有向有圈图中所有的模型节点和有向线段,形成无向图或有向有圈图的内部模型。
[0058]数据文件读入后,再将核心点与起点连接起来。在本发明中,因为无向图或有向有圈图实质上是有圈图,所以即使采用层次化显示方法进行显示,也不存在终点。
[0059]为了减少模型的数据量,尽管无向图或有向有圈图可以理解为有向图,但在存储时仍然只需要存储一条边。
[0060]3)初始化
[0061]主要将节点数据对象的搜索标志设置为未搜索。
[0062]4)对无向图或有向有圈图模型进行宽度优先搜索并显示
[0063]采用宽度优先搜索方法进行无向图或有向有圈图的层次化显示操作,即从核心点或起点开始,一层一层向外搜索并显示每个无向图或有向有圈图的节点。按照搜索的过程,可以称一条边的两个端点之间关系是父子关系,即先搜索过的端点是后搜索到的端点的父节点,后者是前者的子节点。本发明规定,先搜索到的端点展开它的子节点,后搜索到的端点不展开子节点。当无向图或有向有圈图的宽度搜索过程结束后就得到一个树状表示的无向图或有向有圈图,其中树窗口中图形标志为矩形(“■”或“□”)的节点表示已展开子节点,而图形标志为三角形(“▲”或“Λ”)的节点表示不展开子节点。
[0064]对无向图和有向有圈图进行宽度搜索并显示过程是,从起点开始对每个节点做如下工作:
[0065](4.1)如果当前模型节点标志设置为未搜索,则进入(4.2),否则进入(4.3);
[0066](4.2)获得当前模型节点所有的子模型节点,将其显示在树窗口当前节点对应的树节点的下面作为子节点。这些树窗口的子节点记录它们所对应的模型节点的指针,同时将当前模型节点的标志设置为已扩展,其值为对应树节点的句柄;
[0067](4.3)取得下一个当前层的模型节点,重复(4.1)-(4.3),直到当前层全部模型节点都处理完毕;
[0068](4.4)取得下一层的模型节点,重复(4.1)-(4.4),直到所有模型节点都处理完毕。
[0069]5)扩展处理
[0070]虽然以树窗口层次化形式显示的无向图可以方便地进行无向图或有向有圈图的绘制,但对于无向图或有向有圈图的理解仍然存在一定的困难。例如,当无向图或有向有圈图节点比较多、层次比较深时,查看当前节点的相连节点就不方便。另外,当我们想知道图形标志为三角形(的节点时却因为当前节点没有展开而不方便。
[0071]为了有效地查看当前节点的相关联节点和了解比较多的组成情况,本发明设计了两种操作:关联节点显示操作和展开节点显示操作。其方法是:
[0072](5.1)当计算机用户需要观察某一个节点的所有相关联的节点时,将鼠标移到该节点的树节点位置,然后单击鼠标右键弹出一个对话框,显示当前树节点的所有相关联的节点。该扩展处理称为关联节点显示操作。
[0073](5.2)当计算机用户需要观察某一个节点的展开的子节点情况时,将鼠标移到该节点的树节点位置,然后双击鼠标左键,树窗口自动将当前节点的展开节点作为选择节点。如果展开节点不在当前窗口内,系统将自动移动树并显示该展开节点。该扩展处理称为展开节点显示操作。展开节点显示操作和关联节点显示操作尽管都是显示当前节点的子节点,但在展开节点处可能观察到更多子节点及其相关信息,包括多层子节点和兄弟节点信届、O
[0074]通过扩展处理,本发明可以动态地查看和查找任意无向图或有向有圈图中的节点及其关系,不增加无向图或有向有圈图显示中的节点和有向线段数量。虽然显示无向图或有向有圈图最好的方法是用二维或多维图的方式,但本发明对于无向图或有向有圈图的显示也非常有利,因为层次化的显示也保留了无向图或有向有圈图的一些特征,例如,图2是一个对称结构,而采用本发明显示后的结果也是对称结构,如图5所示。
[0075]下面以计算机实际开发过程为例,说明本发明有向无向图或有向有圈图的层次化显示方法的实现过程。本发明采用VC++6.0系统进行开发,以图1?图7所示的附图作为说明对象,根据本发明所揭示的无向图或有向有圈图的层次化显示的流程图和实现方案说明如下:
[0076]步骤1:创建无向图或有向有圈图的起点
[0077]定义节点类为CNode,则CNode主要数据结构如下:
[0078]CString m_Name ;// 节点的名称
[0079]CEdge*m_In ;// 所有的入度链
[0080]CEdge*m_0ut ; // 所有的出度链
[0081]int m_Flag ;// 处理标志
[0082]CNode*m_Next ;// 指向下一个节点
[0083]定义有向线段类为CEdge,则CEdge的主要数据结构如下:
[0084]CString m_Relat1n ;//具体的先后顺序关系
[0085]CNode*m_Node ;// 被联接的节点
[0086]CEdge*m_Next ;// 下一个有向线段
[0087]int m_Flag ;// 处理标志
[0088]创建起点节点变量,其成员变量m_Name设为“起点”,其他所有的数据项均为空,标志为O。
[0089]步骤2:读入数据文件
[0090]首先从数据文件中读入核心点,创建核心点数据对象,并放在第一层。
[0091]然后从数据文件中读入描述无向图或有向有圈图的有向线段数据,生成相应的CNode和CEdge对象,并将CEdge对象放入对应的CNode中,形成无向图或有向有圈图的数据模型。由于无向图是对称的,所以可以仅存储一半的边数据,因此实际上CNode的成员变量m_In是不需要记录的。
[0092]最后将核心点数据对象与起点对象相连,即直接在起点CNode对象的m_0ut成员中加入核心点对象即可。
[0093]从纯数学的角度来看,虽然在无向图或有向有圈图中没有核心点,但仍然可以根据工程意义或者人为的要求设置一个核心点。只有设定了核心点后,才可以进行宽度优先搜索,才可以对无向图或有向有圈图进行层次化显示。
[0094]如果将核心点作为宽度优先搜索的起始搜索点,则不必创建起点。
[0095]步骤3:初始化
[0096]搜索全部CNode对象,并将其成员变量m_Flag设置为未搜索。
[0097]步骤4:对无向图或有向有圈图模型进行宽度搜索并显示
[0098]从起点或无向图或有向有圈图的根节点开始,一层一层向外搜索并显示每个无向图或有向有圈图节点。如果当前节点已经展开,则不再展开,并将该节点的图像标志设为三角形(“▲”或“Λ”);否则将该节点的图像标志则设为矩形(“■”或“口”)。
[0099]每个树窗口的节点记录对应的无向图或有向有圈图节点对象的指针,而在无向图或有向有圈图节点对象的成员变量m_Flag中记录一个树节点的句柄,该节点为展开树节点。
[0100]其过程如图3所示。各步骤说明如下:
[0101]步骤301:开始。
[0102]步骤302:将起点加入到当前层中。以下的搜索针对当前层中的节点。
[0103]步骤303:检查当前层中是否存在没有进行处理的节点。
[0104]步骤304:如果当前层中还存在没有处理的节点,则取出一个节点。
[0105]步骤305:判断该节点成员变量m_Flag是否为未搜索状态。
[0106]步骤306:如果该节点成员变量m_Flag是未搜索状态,表示它的子节点没有展开,则在树窗口中显示它的子节点,同时在这些树窗口的子节点中记录对应的节点指针,最后将当前节点对应的树节点句柄记录在当前节点的成员变量m_FIag中。
[0107]步骤307:将当前节点的所有子节点加入到下一层中。
[0108]步骤309:如果当前层所有的节点都已处理,即不存在未处理节点,则检查是否到达最后一层。
[0109]步骤308:如果没有到达最后一层,则将下一层设置为当前层,转到步骤303,重复以上过程。
[0110]步骤310:如果达到最后一层,说明全部节点都已遍历,则退出当前过程。
[0111]本步骤完成后,图1的数据将得到图4的显示结果,图2的数据将得到图5的显示结果。
[0112]步骤5:扩展处理
[0113]扩展处理主要包括两个操作:关联节点显示操作和展开节点显示操作。
[0114]对于关联节点显示操作,在对右键的消息响应程序里,可以用一个循环语句获得当前节点所有边的另一个端点,然后将其显示在一个对话框中。如图6所示,当鼠标落在树节点“11”时,点击右键,系统弹出一个标题为“与“11”相连的节点”对话框,显示所有与节点“11”相连的节点。
[0115]对于展开节点显示操作,首先构造一个双击响应程序,在该段程序里,检查当前树节点是否是展开树节点,如果是展开树节点,则该段程序可直接退出;如果不是展开树节点,则在树窗口中选择对应的展开树节点。如果该节点的展开树节点不在当前窗口的显示范围内,则系统会自动移动树窗口的显示内容而使该节点的展开节点可视。例如,在图4中双击图形标志为三角形(“▲”或“Λ”)的树节点“11”(图4中虚圆框部分),则系统找到图形标志为矩形(“■”或“□”)的树节点“11”(图7中虚圆框部分),并将其选择为当前节点。
[0116]本具体实施步骤适合一般的计算机系统关于无向图或有向有圈图的显示。对本领域的普通技术人员而言,本发明所涉及的数据结构和算法可以在一般的计算机系统中实现,举例而言,可以使用VC++、Java等任何高级程序设计语言加以实现。
[0117]本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种无向图或有向有圈图的层次化显示方法,其特征在于,所述方法包括如下步骤: (1)创建无向图或有向有圈图的起点; (2)读入数据文件,根据三元组数据文件构建无向图或有向有圈图中所有的模型节点和有向线段,形成无向图或有向有圈图的内部模型; (3)初始化,将节点数据对象的搜索标志设置为未搜索; (4)对无向图或有向有圈图的模型进行宽度优先搜索并显示,从核心点或起点开始,一层一层向外搜索并显示每个无向图或有向有圈图的节点,包括如下子步骤: (4.1)如果当前模型节点标志设置为未搜索,则进入(4.2),否则进入(4.3); (4.2)获得当前模型节点所有的子模型节点,将其显示在树窗口当前节点对应的树节点的下面作为子节点;这些树窗口的子节点记录它们所对应的模型节点的指针,同时将当前模型节点的标志设置为已扩展,其值为对应树节点的句柄; (4.3)取得下一个当前层的模型节点,重复(4.1)-(4.3),直到当前层全部模型节点都处理完毕; (4.4)取得下一层的模型节点,重复(4.1)-(4.4),直到所有模型节点都处理完毕。
2.如权利要求1所述的方法,其特征在于,所述步骤(2)具体包括: 从数据文件中读入无向图或有向有圈图的核心点; 从数据文件中读入三元组数据,并依据这些数据构建无向图或有向有圈图中所有的模型节点和有向线段,形成无向图或有向有圈图的内部模型; 数据文件读入后,再将核心点与起点连接起来; 所述三元组用来描述无向图或有向有圈图中的任一条线段E:E= (Nin, R,Ntjut),这里Nin表示E的一个端点Arat表示E的另一个端点;R表示端点Nin和端点Nrat之间的关系。
3.如权利要求1或2所述的方法,其特征在于,所述方法还包括: (5)扩展处理,对静态关系图进行扩展处理,使之能动态显示当前节点的相连节点或当前节点的展开节点;所述扩展处理包括关联节点显示操作或展开节点显示操作,其中: (5.1)关联节点显示操作:当用户需要观察某一个节点的所有相关联的节点时,将鼠标移到该节点的树节点位置,然后单击鼠标右键弹出一个对话框,显示当前树节点的所有相关联的节点; (5.2)展开节点显示操作:当用户需要观察某一个节点的展开的子节点情况时,将鼠标移到该节点的树节点位置,然后双击鼠标左键,树窗口自动将当前节点的展开节点作为选择节点。
【文档编号】G06F3/0481GK104461497SQ201410605691
【公开日】2015年3月25日 申请日期:2014年10月30日 优先权日:2014年10月30日
【发明者】尹文生, 尹强 申请人:华中科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1