Почему я написал это


Ранее я уже описывал, как создавать движение и рисовать его траекторию (см. меню сайта). В частности, я предлагал скрипт для создания равномерного движения по эллипсу). Примерно тогда же я заметил в сети, что кому-то требовалось не просто движение по эллипсу, а движение сообразно с небесной механикой, т.е. движение подобно тому, как движется тело около притягивающего центра в соответствии с законом Ньютона. В такой постановке задачи тело движется неравномерно (если только траектория не является окружностью). Интересно, а как это происходит? Вот мой ответ, созданный на скорую руку. Проанализируйте предоставленный здесь код и улучшите его по своему усмотрению, если потребуется.

Движение по орбите сообазно с небесной механикой

Планеты и спутники Земли движутся по эллиптическим и другим орбитам неравномерно: скорость движения тем больше, чем ближе к притягивающему центру находится движущийся объект, и наоборот, при удалении от центра притяжения скорость уменьшается. Однако секториальная скорость постоянна.

Примеры движения по орбите:

Ниже показан видеоролик одного из примеров. Обратите внимание, как изменяется угловая скорость в зависимости от положения на орбите. Реальные примеры можно посмотреть по приведённым выше ссылкам.

Немного теории

Движение по орбите (круговой, эллиптической, параболической, гиперболической) около некоторого притягивающего центра (полюса) происходит, вообще говоря, так, что секториальная скорость (или модуль момента количества движения) остаётся постоянным. На рисунке показана эллиптическая орбита с полюсом F. Большая полуось a для эллипса равна половине его наибольшего диаметра, для окружности — радиусу, для гиперболы и параболы большая полуось имеет другой смысл. За равные промежутки времени радиус-вектор объекта заметает равные площади — секториальная скорость постоянна. Это обнаружил Кеплер, а затем воспринял и Ньютон в свей теоретической механике. Секториальная скорость равна 1/2 модуля момента количества движения, делённого на массу.

Входными данными для организации движения объекта по орбите у нас являются большая полуось a, эксцентриситет e и угловая скорость w0 в ближайшей к полюсу точке (перицентре). Параметры a и e определяют форму орбиты, w0 задаёт движение по ней. В точке перицентра вычисляем значение k модуля момента количества движения (считая массу объекта равной 1). Затем перемещаем объект по орбите на угол такой, чтобы момент количества движения оказался равным ранее вычисленной величине k. И так далее.

О коде

Движение объекта по орбите, а также рисование самой орбиты реализуется посредством функции orbita() с множеством параметров, таких как большая полуось (a), эксцентриситет (e), угловая скорость в перицентре (w0) и др. Так, можно задать начальное положение объекта на орбите, повернуть её ось и даже указать скорость поворота оси. При этом орбита может отображаться в виде линии или не отображаться. При желании можно отобразить основные параметры орбиты и движения объекта по ней, что полезно для отладки.
Tип орбиты (окружность, эллипс, парабола, гипербола)определяется эксцентриситетом — параметром e.

В html-документе необходимо создать два объекта canvas, с одинаковыми размерами и позициями. На первом рисуются полюсы и орбиты, а на втором — движущиеся объекты. При этом необходимо задать в тегах <canvas> атрибуты id='orblayer1' и id='orblayer2' соответственно. Посредством других атрибутов или CSS-параметров при желании можно задать размеры, фон, угол поворота и масштаб.
Для отображения объекта и полюса можно создать в html-документе соответствующие элементы (например, картинки посредством <img>) с атрибутами id, значения которых передаются функции orbita() в качестве параметров objid и polusid. Если этого не делать, то функция orbita() создаст объект и полюс в виде маленького квадратика и кружка соответственно.
Jscript-код содержит определение функции orbita(), а также один или несколько вызовов этой функции со своими наборами параметров.
При желании код нетрудно модифицировать в соответствии со своими дополнительными потребностями.

Примеры движения по орбите: