【问题标题】:Static order of JUNG vertices, binary trees in JUNGJUNG顶点的静态顺序,JUNG中的二叉树
【发布时间】:2015-05-26 22:45:24
【问题描述】:

所以我实际上有两个问题。 首先,我可以指定显示顶点的顺序吗?我的意思是,当我尝试将顶点的直线可视化时,有时它会先到最后,有时会从最后到最后。这是我的代码 sn-p。还有没有比将垂直尺寸更改为低的更好的方法来制作直线?

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);
    }

【问题讨论】:

  • TreeLayout 应该使用一致的 x 和 y 间距来渲染边缘;你有其他显示的屏幕截图吗?

标签: java graph tree binary-tree jung


【解决方案1】:

图中节点或节点的邻居/后继/前任的迭代顺序由图实现确定。有些实现强制执行一致的排序,有些则没有。一种实现方式:http://jung.sourceforge.net/doc/api/edu/uci/ics/jung/graph/DirectedOrderedSparseMultigraph.html

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多