2015-05-26 110 views
0

所以我实际上有2个问题。 首先,我可以指定顶点的显示顺序吗?通过这个我的意思是,当我尝试直观地看到顶点的直线时,有时会首先到最后,有时最后到第一个。这是我的代码片段。还有什么更好的方法来做直线比改变垂直维度低?JUNG顶点,二叉树的JUNG的静态顺序

Tree<GraphNode, String> g1 = q.transformToGraph(); 

Layout<GraphNode, String> layout = new ISOMLayout<GraphNode, String>(g1); 
    layout.setSize(new Dimension(1600, 25)); 
VisualizationViewer<GraphNode, String> vv = new VisualizationViewer<GraphNode, String>(layout); 
vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line()); 
VertexLabelAsShapeRenderer<GraphNode, String> vlasr = new VertexLabelAsShapeRenderer<GraphNode, String>(vv.getRenderContext()); 
vv.getRenderContext().setVertexShapeTransformer(vlasr); 
vv.getRenderContext().setVertexLabelTransformer(
    new ChainedTransformer<GraphNode, String>(
      new Transformer[]{new MyLabeller()})); 
vv.getRenderer().setVertexLabelRenderer(vlasr); 
return vv; 

transformToGraph函数返回DirectedSparseGraph。

也有没有什么办法没有写我自己的布局,使一个很好的二叉树可视化。特别是BST,因为TreeLayout使得边缘在一些边缘的长度和掉期交易双方不同(左是右和周围的其他方法)

Tree<GraphNode, String> g1 = (DelegateTree) q.transformToGraph(); 

    Layout<GraphNode, String> layout = new DynamicTreeLayout<GraphNode, String>(g1, 100, 100); 
layout.setSize(new Dimension(1600, 100));  VisualizationViewer<GraphNode, String> vv = new VisualizationViewer<GraphNode, String>(layout); 
vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line()); 
VertexLabelAsShapeRenderer<GraphNode, String> vlasr = new VertexLabelAsShapeRenderer<GraphNode, String>(vv.getRenderContext()); 
vv.getRenderContext().setVertexShapeTransformer(vlasr); 
vv.getRenderContext().setVertexLabelTransformer(
    new ChainedTransformer<GraphNode, String>(
     new Transformer[]{new MyLabeller()})); 
vv.getRenderer().setVertexLabelRenderer(vlasr); 
return vv; 

这里transformToGraph改变了我对BST DelegateTree。

下面是如何

@Override 
    public DelegateTree<GraphNode, String> transformToGraph() { 
     DelegateTree<GraphNode, String> graph = new DelegateTree<GraphNode, String>(); 
     if (root == null) { 
      graph.setRoot(null); 
      return graph; 
     } 
     GraphNode rootNode = new GraphNode(root.getValue()); 
     graph.setRoot(rootNode); 
     if (root.getLeft() == root.getRight()) { 
      return graph; 
     } 
     addNodeToGraph(rootNode, root.getLeft(), graph); 
     addNodeToGraph(rootNode, root.getRight(), graph); 
     return graph; 
    } 
    protected void addNodeToGraph(GraphNode parent, TreeNode node, DelegateTree<GraphNode, String> graph) { 
     if (node == null) { 
      return; 
     } 
     GraphNode curr = new GraphNode(node.getValue()); 
     graph.addChild(parent.getValue() + node.getValue(), parent, curr); 
     addNodeToGraph(curr, node.getLeft(), graph); 
     addNodeToGraph(curr, node.getRight(), graph); 
    } 
+0

TreeLayout应该使用一致的x和y间距来渲染边缘;你有截图显示,否则? –

回答

0

节点的迭代中的曲线图的顺序,或一个节点的邻居/接班人/前辈,由图形实现确定。一些实现强制执行一致的顺序,有些不执行。一个实现:http://jung.sourceforge.net/doc/api/edu/uci/ics/jung/graph/DirectedOrderedSparseMultigraph.html

如果你想要一个线图,你很可能会想编写自己的布局实现;但它应该很容易。 (对于一般图形来说,良好的布局算法要困难得多,但对于简单的链应该基本上很简单。)