【发布时间】:2011-05-14 04:47:32
【问题描述】:
只是想在开始实施之前检查一下我的理论是否正确。
常量:
-
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 设置为什么?
【问题讨论】:
-
不要忘记某种阻尼。否则,您的顶点将永远摆动。
-
看起来你的“for each edge”循环除了v1的那一行之外应该还有v2的一行。
-
另外,你如何检测外部循环的条件“能量最小状态”何时满足?在我看来,这需要更具体一点。
-
感谢...您的第一条评论 - 现在已修复。当所有顶点的速度都是标称的(非常小)时,就达到了“能量最小状态”。
-
也许这隐含在您的伪代码中,但每个加速语句
velocity += ...都需要提供方向。我假设你可以通过将加速度的大小乘以 (v1 - v2) 或 (v2 - v1) 来得到这个。
标签: algorithm layout graph-theory force-based-algorithm