据我所知,这需要一些解决方法;我只会用 Graphviz DOT 语言来做。我先给你解决方案,然后解释如何扩展它。
这是结果图:
这是生成图形的 Graphviz 代码:
graph atree {
Item1 [shape=none,label="Item 1",pos="2.2,1.1!"];
Item2 [shape=none,label="Item 2",pos="2.2,0.1!"];
Item3 [shape=none,label="Item 3",pos="2.9,-0.3!"];
A [shape=box,color=lightblue,style=filled,pos="2,3!"];
B [shape=box,color=lightblue,style=filled,pos="1,2.1!"];
C [shape=box,color=lightblue,style=filled,pos="3,2.1!"];
D [shape=box,color=lightblue,style=filled,pos="1.5,1.5!"];
E [shape=box,color=lightblue,style=filled,pos="1.5,0.5!"];
D0 [style=invisible,fixedsize=true,width=0,height=0,pos="2,2.5!",label=""];
D1 [style=invisible,fixedsize=true,width=0,height=0,pos="1,2.5!",label=""];
D2 [style=invisible,fixedsize=true,width=0,height=0,pos="3,2.5!",label=""];
D3 [style=invisible,fixedsize=true,width=0,height=0,pos="1,1.5!",label=""];
D4 [style=invisible,fixedsize=true,width=0,height=0,pos="1,0.5!",label=""];
D5 [style=invisible,fixedsize=true,width=0,height=0,pos="1.5,1.1!",label=""];
D6 [style=invisible,fixedsize=true,width=0,height=0,pos="1.5,0.1!",label=""];
D7 [style=invisible,fixedsize=true,width=0,height=0,pos="2.2,-0.3!",label=""];
A -- D0 -- D1 -- B -- D3 -- D4 -- E [color=blue];
E -- D6 -- Item2 -- D7 -- Item3 [color=blue];
D0 -- D2 -- C [color=blue];
D3 -- D -- D5 -- Item1 [color=blue];
}
如果将其放入名为inputfile.dot 的文件中,则可以使用命令neato -Tpng inputfile.dot > outfile.png 获取生成的图像文件。
现在有几个关于它是如何工作的cmets:使用A, B, C, D, E, Item1, Item2, Item3 构建树的代码很简单(属性仅设置颜色和框样式)。使线条笔直和正交的技巧包括 1) 将大小为零的不可见节点添加到图形中,以及 2) 将所有对象定位在画布上的绝对坐标中。步骤 1) 需要辅助节点 D1, D2, D3, D4, D5, D6, D7,步骤 2) 需要 pos="x,y!" 选项。请注意,您需要在 pos 命令末尾添加 ! 符号,否则位置将不会被视为最终位置,并且布局仍会更改。
您可以通过首先定位一个新节点(通过使用节点 A ... Item3 的代码作为模板)添加额外的节点,添加一个不可见的辅助节点(使用 pos 以便所有进出它的连接都是正交),然后通过<StartingNode> -- <AuxiliaryNode> -- <NewNode> 将连接添加到图形。