我正在用JavaScript做一个小的N体模拟。正如我所料,但我注意到了一些奇怪的事情。仿真使用的是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
提亚
发布于 2016-01-19 15:50:26
在您的代码中,var dist = vect.x * vect.x + vect.y * vect.y;
实际上将dist
设置为距离的平方,因此force.length = (this.gravity * pa.mass * pb.mass) / dist;
应该给出正确的结果。
发布于 2016-01-19 15:48:57
解释
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;
我想也许你对模拟应该如何工作的期望已经破灭了。
https://stackoverflow.com/questions/34889042
复制