一种方法是使用伪物理模型。如果物体相连,它们就会具有排斥力和吸引力。
您可以根据施加到对象上的力的总和来移动对象:在每一步计算施加到对象上的力的总和并将其沿力的方向移动。
在伪代码中,一次迭代将是:
for each object o1
force[o1] = 0
for each object o2
if o1 and o2 are linked
force[o1] += attraction_force(o1, o2)
else
force[o1] += repulsion_force(o1, o2)
for each object o1
move(o1, force[o1])
Run Code Online (Sandbox Code Playgroud)
当对象达到稳定状态时停止迭代。
您可能需要尝试不同的力定律。特别是,您希望相邻对象快速达到平衡。我会尝试与距离成线性(如弹簧)或二次(重力/电吸引力)的力强度
此外,您可能需要随机移动对象,以防止图形的某些部分保持卡住状态。第一次迭代的随机移动量应该很大,并随着时间的推移而减少。