1

我正在用 JavaScript 做一个小小的 N-Body 模拟。它按照我的预期运行,但我注意到一些奇怪的事情。模拟使用 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

4

2 回答 2

3

在您的代码中,var dist = vect.x * vect.x + vect.y * vect.y;实际上设置dist距离的平方,因此force.length = (this.gravity * pa.mass * pb.mass) / dist;应该给您正确的结果。

于 2016-01-19T23:50:26.850 回答
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;

我认为您对模拟应该如何工作的期望可能会偏离。

于 2016-01-19T23:48:57.640 回答