两节点间存在多条边
问题
有如下的一份数据,如何使用 F6 让两个节点之间显示多条边?
const data = {
nodes: [
{
id: 'node1',
x: 100,
y: 150,
label: 'node1',
},
{
id: 'node2',
x: 300,
y: 150,
label: 'node2',
},
],
edges: [
{
source: 'node1',
target: 'node2',
},
{
source: 'node2',
target: 'node1',
},
],
};
由于默认的边形状是直线,使用直线绘制同样两个端点之间的多条边时,会出现重叠的情况。因此我们使用以下代码将边绘制为二阶贝塞尔曲线 'quadratic'
。
const graph = new F6.Graph({
container: GRAPH_CONTAINER,
width: 500,
height: 500,
defaultNode: {
style: {
fill: '#DEE9FF',
stroke: '#5B8FF9',
},
labelCfg: {
style: {
fontSize: 12,
},
},
},
defaultEdge: {
type: 'quadratic', // 指定边的形状为二阶贝塞尔曲线
style: {
stroke: '#e2e2e2',
},
},
});
graph.data(data);
graph.render();
结果如下:
如果两个节点之间需要显示 3 条、4 条甚至更多条边,该怎么做呢?
我们把数据改成下面这样试试:
const data = {
nodes: [
{
id: 'node1',
x: 100,
y: 150,
label: 'node1',
},
{
id: 'node2',
x: 300,
y: 150,
label: 'node2',
},
],
edges: [
{
source: 'node1',
target: 'node2',
},
{
source: 'node2',
target: 'node1',
},
{
source: 'node2',
target: 'node1',
},
],
};
结果发现并不对。
解决方案
这个时候,需要借助 F6 的 自定义边 功能。
有了这个黑科技,什么样的需求,那还不是分分钟的事。
在使用「自定义边」前,需要明确两件事:
- 需要有个标识来区分两个节点之间是否超过一条同方向边;
- 需要有一个值控制边的弯曲度,以防边重叠。
因此,我们在每条边的数据中添加一个 edgeType
属性以区分不同的边。有了这个约定以后,就可以开始动手撸码了。
完善的自定义边的代码如下。
至此,我们实现了让两个节点之间展示多条边的功能。