力导向图
百科:力导向算法是指通过对每个节点的计算,算出引力和排斥力综合的合力,再由此合力来移动节点的位置。
力导向算法是根据自然界中电子直接互相作用的原理来实现的,自然界中。两个电子靠的太近会产生斥力,隔的太远会产生引力,这样保持一个平衡状态,最终达到维持物体的形态的目的,这里就涉及到了一个库仑定律。
最新版本的d3js里面的力导向算法就用四叉树算法对其进行了优化。
实现逻辑
如果要用代码去实现简化后的力导向图的布局,我们需要几个步骤。
- 设置点数据nodes, 链接数据links。
- 对点进行随机定位。
- 渲染视图
- 执行力算法计算位置,渲染视图
重复执行4操作N次,得到想要的力导向图形。在执行力算法的时候,这里我们把库伦公式简化成了一次函数,所以,要么减一个数,要么加一个数去改变点的坐标。理解起来就很容易了,当然,实际上我们应该加上电子作用力(库伦公式)和弹簧力(胡克定律),让力导向的效果更接近自然界的作用结果。
基于力导向 (Force-directed) 的算法作为弹簧理论算法的一类典型,被广泛应用于描述社交网络等关系型信息图。它的原理其实非常易懂,我们可以把整张网络想象成一个虚拟的物理系统。系统中的每个节点都可以看成是一个带有一定能量的放电粒子,粒子与粒子之间存在某种库仑斥力,使它们两两相互排斥。同时,有些粒子间被一些“边”所牵连,这些 边产生类似弹簧的胡克引力,又紧紧牵制着“边”两端的粒子。在粒子间斥力和引力的不断作用下,粒子们从随机无序的初态不断发生位移,逐渐趋于平衡有序的终 态。同时整个物理系统的能量也在不断消耗,经过数次迭代后,粒子之间几乎不再发生相对位移,整个系统达到一种稳定平衡的状态,即能量趋于零。此刻,最终的 这幅理想的社交网络图也基本绘制完成。
- 随机分布初始节点位置;
- 计算每次迭代局部区域内两两节点间的斥力所产生的单位位移(一般为正值);
- 计算每次迭代每条边的引力对两端节点所产生的单位位移(一般为负值);
- 步骤 2、3 中的斥力和引力系数直接影响到最终态的理想效果,它与节点间的距离、节点在系统所在区域的平均单位区域均有关,需要开发人员在实践中不断调整;
- 累加经过步骤 2、3 计算得到的所有节点的单位位移;
- 迭代 n 次,直至达到理想效果。