Имитация орбиты планеты с векторами

Чтобы лучше понять, как работают векторы, я пытаюсь создать очень простую симуляцию вращения Земли вокруг Солнца. В настоящее время все, чего я хочу, — это чтобы Земля вращалась вокруг Солнца. Никакие законы физики не принимаются во внимание.

Я думал, что то, что я делаю, сработает, однако оно создает какое-то движение в спираль Фибоначчи.

// initial positions
vec2 sun(0.0,0.0);
vec2 earth(10.0,0.0);

while(true) {

vec2 earthToSun = normalize(sun - earth); // this is the vector 'pointing from the earth towards the sun'
vec2 speedVector = vec2(-earthToSun.y, earthToSun.x); // this is the vector perpendicular to the earthToSun vector

earth = earth + earthToSun + speedVector; // move the earth along the resulting vector

}

Что не так в моих расчетах?

3

Решение

Почему бы просто не сделать это с помощью тригонометрии:

#define PI 3.1415926
float r = 10.0;
for (int theta=0; theta<2*PI; theta += 0.01)
{
float x = r*cos(theta),
y = r*sin(theta);
earth = vec2(x, y);
}

Очевидно, изменить период, начальное значение theta, приращение и т. д. по вашему усмотрению.

3

Другие решения

Ваши начальные условия должны быть

vec2 sun(0.0,0.0);
vec2 earth(10.0,0.0);
vec2 speedVector = vec2(-earthToSun.y, earthToSun.x);

Выглядит хорошо. Однако есть две проблемы с вашими уравнениями.

  1. Положение вашей земли должно меняться со временем так:

    vec2 earthToSun = normalize(sun - earth);
    earth = earth + earthToSun;  // no speedVector added here
    

    Обратите внимание, что я сделал не добавлять speedVector на землю в коде обновления. То, что вы сделали, — это ускорение вашей земли на протяжении всего симуляции.

  2. Ваш normalize функция должна будет нормализовать в квадрате расстояние. Я не уверен, как ты это реализовал. F знак равно г m1 м2 / р ^ 2. Я подозреваю, что ваш normalize только делится на р, не р ^ 2. Проверьте https://en.wikipedia.org/wiki/Gravitational_constant для справки

Ваша земля не обязательно пойдет по кругу. Скорее всего, это будет эллиптическая орбита. Также обязательно выберите достаточно маленький размер шага. За итерацию, earth должно меняться лишь на небольшую долю от его расстояния до Солнца, иначе вы будете накапливать очевидные ошибки интеграции.

1

По вопросам рекламы [email protected]