我需要做一些图形布局绘图,并且一直在考虑使用这里实现并讨论的 Spring 布局算法之类的东西
但是我的节点都有一个宽度和高度(是一个实体图)。谁能解释我如何将其纳入方程式?
以Graph JavaScript 框架为起点,您可以执行以下操作。我假设该类Node
已通过属性width
和height
. 然后,在函数layoutRepulsive
中,必须更改计算节点距离的表达式以尊重这些大小:
var dx = Math.max(0, Math.abs(node2.layoutPosX - node1.layoutPosX) - 0.5*(node2.width+node1.width));
var dy = Math.max(0, Math.abs(node2.layoutPosY - node1.layoutPosY) - 0.5*(node2.height+node1.height));
maximum 函数强制将 0 作为距离的最低可能值,即使它们的边界框重叠。
查看您提供的第一个链接,第 240 行:
var repulsiveForce = this.k * this.k / d;
代表排斥势(那是物理学)。该数字越大,几何状态的可能性就越小。d
是两个节点之间的距离,this.k
是弹簧刚度。这种潜力对于距离变得无限d = 0
。
你想把这个潜力翻译成一定的长度(你的盒子的大小),所以d
用d - length
. 这意味着,排斥力在远处变得无限length
。仍然存在问题,排斥力会随着距离减小,小于length
,这必须由一些条件覆盖:
if (d + 0.0001 < length) repulsiveForce = bigbigNumber;
我补充0.0001
说,排斥力永远不会变得无限,而只会变得很大,因为计算机不能很好地处理无限。