SFML:Реализация перигелия и афелия

Планета движется по закону:

x=Sun.x+radius.x*cos(time*speed);
y=Sun.y+radius.y*sin(time*speed);

Как реализовать ускорения при приближении до планеты и уменьшении скорости при отдалении? Спасибо!


Ответы (1 шт):

Автор решения: MBo

Решите численно уравнение Кеплера

2*Pi * t / T = E - e * sin(E)

где T - период, e - эксцентриситет

Т.е. в каждый период времени t нужно найти величину E (эксцентрическую аномалию), а из неё уже истинную аномалию v, что и даст положение планеты.

v = 2 * atan (tan(E/2) * Sqrt((1+e)/(1-e)))

введите сюда описание изображения

Простая имитация разной скорости (с Солнцем в центре, а не в фокусе, как у автора) с использованием такого (Delphi) кода - приращение угла зависит от самого угла.

 cf := 1.0 / (2 + Cos(2 * an));
 an := an + speed * cf;
 x := cx + Round(rx * Cos(an));
 y := cy + Round(ry * Sin(an));
 Canvas.Brush.Color := clBlue;
 Canvas.Ellipse(x - 10, y - 10, x + 11, y + 11);

введите сюда описание изображения

→ Ссылка