在开始实现之前,只是想确认一下我的理论是否正确。
常数:
m
= 顶点的质量(都相同 - 可能将其设置为节点的半径)k
= 恒定的边缘力。l
= 达到“能量最小状态”的边缘长度。
变量:
d
= 两个顶点之间的距离。cl
= 边缘的当前长度。
理论:
每个顶点对每个其他顶点都有排斥力,其公式为:m / (d^2)
。对于每条边缘,它展示了一个力,使得两个顶点在方向上被拉向达到“能量最小状态”;所以每个顶点受到的力为:-k * ((l - cl) / 2)
。
伪代码:
until energy minimal state
for each vertex v1
for each vertex v2
if v1 != v2
v1.velocity += m / square_distance (v1, v2)
endif
end
end
for each edge e
e.v1.velocity += -k * (delta_min_energy_len (e) / 2)
e.v2.velocity += -k * (delta_min_energy_len (e) / 2)
end
for each vertex v
v.position += (v.velocty * dampening_constant)
end
end
评论:那这个会起作用吗?我应该将m
和k
设置为多少?
velocity += ...
都需要提供方向。我假设您将通过将加速度的大小乘以 (v1 - v2) 或 (v2 - v1) 来获得此信息。 - LarsH