【问题标题】:How to inverse arrow head position in Jung tree?如何在荣格树中反转箭头位置?
【发布时间】:2018-02-06 00:20:48
【问题描述】:

我正在使用 Jung 构建一棵树,它的边箭头必须倒置。也就是说,不是拥有父母 -> 孩子,而是拥有孩子 -> 父母。

我无法更改树形布局结构,因为我正在使用相应的方法进行进一步分析 - 我只需要此功能用于视觉目的。

我在我的 Eclipse 项目中使用 jung 库作为依赖项,无法编辑直接提供的文件。我已经尝试扩展 BasicEdgeRenderer 类(并且还尝试创建此类的修改副本)以覆盖 drawSimpleEdge() 方法并反转顶点,但这会导致无数我似乎无法修复的错误。

然后我考虑过使边缘无方向并在所需点手动添加箭头,但到目前为止没有成功!

任何关于如何实现这一点的帮助将不胜感激!

编辑:我添加了与图形显示相关的代码部分 - 树具有节点类型的自定义节点的顶点和字符串类型的边。

Layout<Node, String> newLayout = new TreeLayout<Node, String>((Forest<Node, String>) G);
VisualizationViewer<Node,String> vViewer = new VisualizationViewer<Node,String>(newLayout);
vViewer.getRenderContext().setVertexLabelTransformer(
        new Transformer<Node, String>(){
            public String transform(Node v){
                return v.getLabel();
            }
        });
vViewer.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); 
vViewer.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<Node,String>());
vViewer.getRenderContext().setVertexFillPaintTransformer(vertexPaint);
vViewer.setBackground(Color.WHITE);

【问题讨论】:

  • 欢迎来到 StackOverflow!您可能需要考虑添加最新代码,以便我们为您提供帮助。
  • 供我自己将来参考:我们 (JUNG) 应该考虑让创建“uptrees”变得更容易,其中边缘朝着相反的方向,如您所愿。这可以说是数据模型不是您想要的问题,确切地说不是可视化系统的问题。

标签: java jung


【解决方案1】:

Joshua 的回答很好,但如果您不将第 239 行更改为:

AffineTransform xf = AffineTransform.getTranslateInstance(x2, y2);

到:

AffineTransform xf = AffineTransform.getTranslateInstance(x1, y1);

你根本看不到任何箭头。

【讨论】:

    【解决方案2】:

    您可以对BasicEdgeRenderer.drawSimpleEdge() 进行另一项修改,该修改更加封闭。

    基本上,代码总是绘制一个指向节点的第二个端点的箭头,如果边是无向的,它会绘制另一个指向第一个端点的箭头。

    你想要的是它总是画一个指向 first 节点的箭头,所以你可以改变它(行236-7):

    graph.getEndpoints(e).getSecond()
    

    进入:

    graph.getEndpoints(e).getFirst()
    

    还有这个(245-246 行):

    getArrowTransform(rc, edgeShape, destVertexShape)
    

    进入:

    getReverseArrowTransform(rc, edgeShape, destVertexShape)
    

    (如果您希望修改后的代码也对无向边执行正确的操作 - 您可以更改行 264 以便改为调用 getArrowTransform(),但出于您的目的,您可能不在乎。 )

    您甚至可以创建一个修改后的 BasicEdgeRenderer 版本,该版本可以为您执行此反转操作;逻辑很简单。不过,这对你来说可能有点过头了。

    Tom 的解决方案也很好用,只是修改的范围更广。

    相关问题:Q: How to change arrow position or remove it from an edge ? (JUNG)

    【讨论】:

      【解决方案3】:

      通过执行以下操作,我能够在其中一个树示例程序中获得您想要的效果: 我扩展了 BasicEdgeRenderer 并覆盖了 drawSimpleEdge,如下所示: 首先,在第 342 和 344 行周围,它填充然后绘制边缘箭头。 g.fill(箭头)和 g.draw(箭头)。 注释掉那些行,你就不会得到你不想要的箭头。接下来,代码检查这是否是一个无向图:

      if (graph.getEdgeType(e) == EdgeType.UNDIRECTED)
      

      如果是这样,它会绘制反向箭头(你想要的那个)。通过注释掉测试来查看图形/边是否是无向的,它会画出你想要的箭头。
      抱歉,那个类的代码太乱了。

      【讨论】:

      • 谢谢! - 我已经设法扩展类并覆盖 drawSimpleEdge() 而没有任何错误。但是,无论我做了哪些更改,图表都没有区别......(它也不会在控制台上打印任何东西) - 可以那是因为这个函数实际上没有被调用?非常感谢。
      • 你是否做了这样的事情来将 EdgeRenderer 设置为你写的新的? vViewer.getRenderer().setEdgeRenderer(new MyBackwardsArrowEdgeRenderer());
      • 必须为它创建一个特定的类并做到了——就像一个魅力!谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多