如何反转荣格树中的箭头位置?

How to inverse arrow head position in Jung tree?

我正在使用 Jung 构建一棵树,该树的边缘箭头必须倒转。也就是说,不是 parent -> child,而是 child -> parent。

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

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

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

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

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

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

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

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

如果是这样,它会绘制反向箭头(您想要的那个)。通过注释掉测试,看看 graph/edge 是否是无向的,它会画出你想要的箭头。
抱歉,class.

中的代码太乱了

您可以对 BasicEdgeRenderer.drawSimpleEdge() 进行另一种修改,使其更加密封。

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

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

graph.getEndpoints(e).getSecond()

进入:

graph.getEndpoints(e).getFirst()

和这个(第 245-246 行):

getArrowTransform(rc, edgeShape, destVertexShape)

进入:

getReverseArrowTransform(rc, edgeShape, destVertexShape)

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

您甚至可以创建 BasicEdgeRenderer 的修改版本,它有一个选项可以为您执行此反转;逻辑很简单。不过,这对您来说可能有点矫枉过正。

Tom 的解决方案也可以正常工作,只是修改范围更广。

相关问题:

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

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

至:

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

您根本看不到任何箭头。