在 JUNG 中创建双向箭头

Create bidirectional arrows in JUNG

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

我认为这可能与

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

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

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

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

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

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

你可以做类似这样的 hack 来使(在这种情况下)弯曲的边缘相互重叠:

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