FR算法将所有的结点看做是电子,每个结点收到两个力的作用:1. 其他结点的库伦力(斥力)2. 边对点的胡克力(引力)。那么在力的相互作用之下,整个布局最终会称为一个平衡的状态。
算法结构:
1. 给所有的点一个初始的随机位置
2. 计算每个点收到其他点的库伦力以及所有边对该点的胡克引力,得到该点受到的最终力。
3. 根据步骤2计算的力得到位置的偏移,调整布局中点的位置。
4. 迭代2,3直到网络区域平衡(全部结点的力的作用力较小),或者迭代达到一定的次数。
对于库伦力的计算:
库伦定理:真空中两个静止的电荷之间的相互作用力,与他们的电荷量的乘机成正比,与他们的距离的平方成反比。
在计算中,我们可以将点的点亮量度看成是1,具体的系数要根据布局图的大小来计算,使其得到一个相对的平衡。
所以,计算库伦力的公式演变成 k1/(distance*distance)
胡克定理:弹性物体的应力与应变成正比。
胡克定理的弹性系数也要根据时机情况而定,使其和库伦力保持一个相对的平衡。
所以,胡克力的公式演变成 k2*(distance – idea_distance)
Idea_distance为预期想要的边的长度。
个人理解:算法最终的结果使得整个网络区域一个平衡的位置,相对是比较对称的,边的长度也比较平衡。但是对于交叉的边边并不一定能够使其错开。所以对于边的交错比较严证的图,并不能很好的处理。如下:
但是我在网上看别人的demo跑出来的图,可以将其扭开。感觉代码也只有选取的系数不一样而已。不知道是不是自己的理解有偏差 (~ε(#…