Универсальный закон тяготения - порядок операций
Я работаю над небольшим N-Body Simulation в JavaScript. Он работает, как я и ожидал, но заметил кое-что странное. В симуляции используется интегратор верлетов, а функция, которая накапливает силы, имеет строку:
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
ТИА
2 ответа
В вашем коде var dist = vect.x * vect.x + vect.y * vect.y;
на самом деле настройка dist
на квадрат расстояния, так force.length = (this.gravity * pa.mass * pb.mass) / dist;
должен дать вам правильный результат.
Интерпретация
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;
Я думаю, что ваши ожидания о том, как должна работать симуляция, могут оказаться неверными