我正在使用JavaScript进行一些N-Body Simulation。它按照我的预期运行,但我注意到一些奇怪的事情。模拟使用一个verlet积分器,积累力的函数有以下几行:
force.length = (this.gravity * pa.mass * pb.mass) / dist * dist;
正如我所说,模拟按预期工作,但代码实际上不应该读取:
force.length = (this.gravity * pa.mass * pb.mass) / (dist * dist)
;
哪里的操作顺序对于距离的平方是否正确?当我这样做时,模拟就会爆炸。有点奇怪,错误的方式正常,或似乎。任何人都知道问题是什么?完整的代码和运行示例:
https://gist.github.com/arctwelve/ca5868f80d0b0cd5791e http://bl.ocks.org/arctwelve/ca5868f80d0b0cd5791e
TIA
答案 0 :(得分:3)
在您的代码中,<int:channel-interceptor>
实际上是将var dist = vect.x * vect.x + vect.y * vect.y;
设置为距离的平方,因此dist
应该会为您提供正确的结果。
答案 1 :(得分:2)
的解释
force.length = (this.gravity * pa.mass * pb.mass) / dist * dist;
是
force.length = ((this.gravity * pa.mass * pb.mass) / dist) * dist;
除法运算符和乘法运算符具有相同的运算符优先级,并且它们从左到右分组。因此,你的表达是有效的
force.length = this.gravity * pa.mass * pb.mass;
我想也许你对模拟应该如何运作的期望可能会消失。