【发布时间】: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