0

是否可以使用 FRLayout 在 JUNG 中创建双向箭头?理想情况下,对于 a->b 和 b<-a 的情况,是否有可能使用这些箭头(端点是两端的箭头)的算法?

我认为这可能与

 Renderer.Edge<String, String> edgeRenderer = 
        vv.getRenderer().getEdgeRenderer();

但看不到如何获得箭头的形状

4

2 回答 2

1

如果将边缘渲染为直线,则反平行边缘(a->b 和 b->a)将看起来像您想要的那样。

如果您查看PluggableRendererDemo,您将看到如何更改边缘形状的示例:

vv.getRenderContext().setEdgeShapeTransformer(EdgeShape.line(graph));

如果你真的想将两条单独的边渲染为一条边,那就​​更复杂了;本质上,您需要破解(或子类化)BasicEdgeRenderer,以便它检查反平行边缘并以不同方式处理它们。要在边的两端绘制箭头,请查看该类中用于渲染无向边的代码(可以选择在两端都有箭头)。

于 2018-04-29T18:28:13.817 回答
1

你可以做这样的事情来制作(在这种情况下)弯曲的边缘相互重叠:

        vv.getRenderContext().setEdgeShapeTransformer(new Function<String, Shape> () {
            @Override
            public Shape apply(String edge) {
                Pair<String> endpoints = graph.getEndpoints(edge);
                float controlY = 60.f;
                 // use some hacked 'ordering' of the endpoint nodes so that the curve for A->B is on the same side as the curve from B->A
                if (endpoints.getFirst().toString().compareTo(endpoints.getSecond().toString()) < 0) {
                    controlY *= -1;
                }
                return new QuadCurve2D.Float(0.0f, 0.0f, 0.5f, controlY, 1.0f, 0.0f);
            }
        });
于 2018-05-02T16:07:47.083 回答