我正在制作一个图表来显示不同节点之间的关系.与节点关系越密切(根据业务逻辑),节点应该越靠近在一起.
我注意到,与一些链接linkStrength
的.1
是较短的(我想实现是)和一些其他有同样实力都长比用的那些linkStength
的1
.从关于力布局参数的文档中,我现在找到了这个引用:
默认的linkStrength值为1.0,它保持了linkDistance的完整效果.但是,通过将linkStrength的值设置为小于1,可以放宽距离约束.
这是否意味着,如果我是设置linkDistance
到150
,与链接linkStrength(1.0)
将接近150比与个位linkStrength(.1)
?如果是的话,它们是否需要更短,更长或根本不重要?因为我对布局感到有些惊讶.
简而言之:当使用D3的力布局时,没有内置的方法来强制实施固定长度的链接.力布局本质上是动态的,并且force.linkDistance()和force.linkStrength()的设置值仅对力布局运行时对每次迭代(即每个滴答)执行的计算集引入另一个力.
每个刻度计算有三种力:
1. 链接长度.要计算的第一个力是通过上述方法设定的链路长度的调整.这是在每个链接的循环中完成的,查看源代码,这基本上归结为一行代码:
l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
通过l
计算为链路的源节点和目标节点之间的欧几里德距离,所需的链路距离distances[i]
和链路的strengths[i]
此线确定如何将两个节点拉在一起或将它们分开以近似通过设置的链路距离force.linkDistance()
.很容易看出,链接强度对产生的力有线性影响.但是,与API文档相反,它定义了强度在区间[0,1]中的有效范围,源代码不会对设置的值施加任何限制force.linkStrength()
.
2. 重力.要计算的第二个力将考虑每个节点上的重力.
3. 充电.最后,计算节点电荷的相互作用力.
因为所有计算出的力的影响是叠加的,并且将累加到给定刻度的每个节点的最终运动,所以变得清楚,链接长度仅是整个计算的一部分.另外两种力量可能削弱甚至扭转其影响.
至于你的问题
这是否意味着如果我将linkDistance设置为150,那么linkStrength(1.0)的链接将比具有linkStrength(.1)的链接更接近150?
结果在很大程度上取决于力布局参数的设置和节点的分布,并且仍然不能保证链路的最终长度.