问题描述:需实现,两个节点之间,有多条连线,且连线不重合,每条连线有名称。
难点:在d3中,未使用布局,需要把数据处理成符合d3画图的样子才行。连线使用的是'path',根据连线的 ‘startKey’ 字段和 ‘endKey’ 来设定 source 和 target。因为两个节点之间的多条线,所以source 和target 相同,线会重合。此时需要想办法来添加偏移量。
首先要清楚,要添加偏移量,需要知道哪些连线是一组的,先要把两个节点之间的连线分成一组。这个思路卡了两天。
其实就是对原来的连接数组进行遍历处理,把start和end都相同的即两个节点之间的线放在一个数组里面。再将这些数组放到一个新数组里面,组成一个二维数组。
当数据处理完毕之后,以前没有过处理二维数组的经验,不知道该怎么用d3来处理它,分不清svg是什么结构,该怎么循环这个数组。这块卡了两天。
d3是一门把数据和dom element绑定的语言,所以应该把数据结构和svg结合起来,不能单独考虑一个,不考虑另外一个。
现在的数据结构是一个二维数组,里面的每一项代表每两个节点之间的连线,对应的svg结构应该是一个类为'link'的<g>,为每一项都与<g> 绑定起来。
然后再对绑定好的选择集进行遍历处理,为link绘制路径,每个link的数据结构是一个一维数组,里面存放的是两个节点之间的每条连线的数据,对应的svg结构应该是一个类为'path'的<g>。在绑定之前,应该先对数组中的数据进行处理,因为现在的source 和 target的坐标还相同,应该先给加上不同的偏移量,然后组成一个新的一维数组。此时这个数组就是正常的连线数据,按照平时一条连线那么处理就可以了。绑定好以后,append('path')以及append('text').
tick()里面关于连线数据的更新也是一个难点,因为你结构不清楚之前,这块会一团糟,你不知道该怎么写。只有理清楚了数据结构和svg结构,自然而然就好些了。
现在只需 selectAll('link')继续遍历为每一个Link绘制path。
还有一种解决方案:就是使用弧线,path的'd' 属性使用M arc。需要对arc进行偏移,从同一个点出发。
周六日有时间完善一下。附个demo。