2010-04-29 126 views
3

我有他们之间的组件和关系图。用户使用根组件开始导航。他单击组件上的展开按钮以显示与当前组件相关的新组件。图导航问题

问题在于用户决定折叠节点时。我必须选择一个子树来隐藏,同时使图形保持一致的状态,以便没有展开的节点与图中另一个节点的关系不存在。

现在如果组件之间出现循环/循环,我很难选择子树。为了简单起见,我选择他们扩展的顺序。因此,如果A展开到B和C展开,A将隐藏它创建的节点和边缘。现在考虑下面的情况。

[ - ]表示展开状态,[+]表示尚未展开。 A被展开以显示B和C.然后B被展开以显示D. C被展开,其在C和退出节点D之间创建链接并且还创建节点E.现在用户决定折叠B.由于通过展开顺序D是B的孩子它会崩溃和隐藏D.这种离开图的状态不一致,因为C对D具有边缘,但D不再存在,如果我删除CD边缘,它仍然不一致。如果我折叠C.而E又是一个循环链接,例如A会产生同样的问题。

/-----B[-]-----\ 
A[-]    D[+] 
    \-----C[-]-----/ 
       \ 
       E[+] 

所以,大家任何想法我怎么能解决这个问题。用户需要浏览图形,应该能够崩溃,但我坚持循环节点的问题,在这种情况下任何节点在循环中如果崩溃都会使图形处于不一致的状态。

+0

@Matthieu M.对不起,我有糟糕的一天,我的反应是不够的,虽然我真的有一个理解问题的问题。 – 2010-04-29 22:10:31

+0

@affan请接受我的道歉,我不想粗鲁。 – 2010-04-29 22:11:23

+0

gabriel没问题 – affan 2010-05-03 11:53:08

回答

1

如果一个孩子节点知道有多少父母被链接到它,你可以让一个子节点只在连接一个父节点时才自行折叠。

外推到你的例子

  • 折叠B将要求节点d崩溃。
  • 节点d不垮,因为它有两个家长
  • 乙删除链接到d(留下d只有一个父)
  • 如果现在节点C要求d崩溃,它就会崩溃本身。
0

我认为关闭B应该只关闭B.因为A是主人A不应该关闭,并且从D开始,它也会导致A在C之后,所以D也保持打开状态。

一个实现可能是,每个链接都应该告诉你母版链接,告诉你是否可以在这个方向上达到主人醒来(我想你把图存为双向链表)。或者您每次申请子图关闭时都会触发此规则。

0

我认为你的问题的答案取决于图的用途。任何subgraphp都可能被折叠,只需用新节点替换该子图,而每个连接到该子图的边与新节点重新连接。在这种情况下,图表永远不会不一致。

真正的问题是你的意思是“折叠”。什么操作是自然的,完全取决于图表的用途。

0

有趣的是,我遇到了与应用程序领域完全无关的情况(和循环引用的问题)。

我实施的解决方案非常简单,但我花了一些时间来实现它。有2个问题:

  • 你不想变得不一致
  • 你不想无限循环

我认为它可以很容易地在这里我认为可以实现的,因为你发生关系定向所以第二个问题,不应该打扰我们:

def Expand(node): 
    for c in node.childs: 
    c.parents.insert(node) 
    Display(node, c) 
    if len(c.parents) == 1: Display(c) 

def Collapse(node): 
    for c in node.childs: 
    del node in c.parents 
    Hide(node, c) 
    if len(c.parents) == 0: Collapse(c) 

    Hide(node) 

DisplayHide是用于边缘图形的方法和节点阿里柯。