【问题标题】:Jung : Fixing distance between verticesJung:固定顶点之间的距离
【发布时间】:2014-08-18 10:12:13
【问题描述】:

我正在使用 Jung 来绘制图表。在我的例子中,一个节点可以有多个父节点和多个子节点。

因为一个节点可以有多个父节点,所以我不能使用树布局将我的图形绘制为树。

因此,我使用的是 DAGLayout。但是,在 DAGLayout 中,绘图是自下而上的。

为了解决这个问题,我将图表旋转了 180 度以从上到下绘制它。

代码如下:

    // generate layout
    Layout<SimpleTaskDomain, Integer> layout = new DAGLayout<SimpleTaskDomain, Integer>(g);

    // fix layout size
    layout.setSize(new Dimension(700, 700));


    VisualizationViewer<SimpleTaskDomain, Integer> vv = new VisualizationViewer<SimpleTaskDomain, Integer>(layout);
    vv.setBackground(Color.white);
    vv.setPreferredSize(new Dimension(800, 800));
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<SimpleTaskDomain>());

    Dimension d = layout.getSize();
    Point2D center = new Point2D.Double(d.width / 2, d.height / 2);
    vv.getRenderContext().getMultiLayerTransformer().getTransformer(Layer.LAYOUT).rotate(Math.PI, center);

    vv.setVertexToolTipTransformer(vv.getRenderContext().getVertexLabelTransformer());
    // vv.getRenderContext().setEdgeShapeTransformer(new
    // EdgeShape.Orthogonal<SimpleTaskDomain, Integer>());
    vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<SimpleTaskDomain, Integer>());

    VertexFontTransformer<SimpleTaskDomain> vff = new VertexFontTransformer<SimpleTaskDomain>();
    vff.setBold(true);
    vv.getRenderContext().setVertexFontTransformer(vff);

    Transformer<SimpleTaskDomain, Paint> vertexPaint = new Transformer<SimpleTaskDomain, Paint>() {
        public Paint transform(final SimpleTaskDomain i) {
            return Color.GREEN;
        }
    };
    vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);

    Transformer<SimpleTaskDomain, Shape> vertexSize = new Transformer<SimpleTaskDomain, Shape>() {
        public Shape transform(final SimpleTaskDomain i) {
            Rectangle2D.Double rectangle = new Rectangle2D.Double(-40, -20, 80, 40);
            return AffineTransform.getScaleInstance(2, 2).createTransformedShape(rectangle);
        }
    };

    vv.getRenderContext().setVertexShapeTransformer(vertexSize);

    vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);

我正在将顶点的形状更改为矩形而不是默认圆形。

但是,在输出图中,顶点是重叠的。

如何控制顶点之间的距离,以免发生重叠。

我想要一个顶点之间有适当距离的树状结构。

感谢阅读!

【问题讨论】:

  • 嗨,Vicky,我的情况和你一样,一个节点可以有多个父节点和多个子节点,我需要绘制一棵树,所以你在 JUNG 中为此使用了哪个图的 impl,最后还有哪个布局?谢谢!

标签: java jung


【解决方案1】:

您的问题是“DagLayout”,但您的代码示例是“FRLayout”。

无论如何,DagLayout 不允许您指定节点距离。

我建议你遵循 MinimumSpanningTreeDemo 中的大致大纲:

(1) 从图中提取适当的生成树。

(2) 使用 TreeLayout 布局生成树(允许您指定间距)。

(3) 使用 Tree Layout 中的布局位置为您的原始图形创建一个新的 StaticLayout 实例,并使用该布局进行可视化。

【讨论】:

  • 对不起!试图查看 FR 布局的外观以及它是否会解决我的问题...纠正了问题...您的第 3 点...“使用布局位置等等...”... MinimumSpanningTreeDemo 显示这个?因为在输出中我看到三个图:左侧的 KKLayout(3 个图).. 右上角的生成树(4 个图)和使用 TreeLayout 的原始树(再次 4 个图)...但我想要一个包含所有它们之间的顶点和边,而不是多个图......这可能......我为长评论道歉!
猜你喜欢
  • 2021-03-25
  • 2020-12-21
  • 2019-07-29
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多