在 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);
}
});
是否可以使用 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);
}
});