Универсальный закон тяготения - порядок операций

Я работаю над небольшим 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;

Я думаю, что ваши ожидания о том, как должна работать симуляция, могут оказаться неверными

Другие вопросы по тегам