是否可以使用 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));
如果你真的想将两条单独的边渲染为一条边,那就更复杂了;本质上,您需要破解(或子类化)BasicEdgeRenderer,以便它检查反平行边缘并以不同方式处理它们。要在边的两端绘制箭头,请查看该类中用于渲染无向边的代码(可以选择在两端都有箭头)。
你可以做这样的事情来制作(在这种情况下)弯曲的边缘相互重叠:
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);
}
});