2013-05-25 3 views
3

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

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

// 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 

} 

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

+0

Я знал, что этот тег не может быть таким, каким вы его использовали, когда я его видел. – chris

+0

попробуйте использовать 0.0, 10.0 и т. Д. Вместо целых чисел – HAL9000

+0

Я удалил тег орбиты и протестировал с помощью поплавков, все тот же. – RaptorDotCpp

ответ

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, приращение, и т.д., как вы считаете нужным.

+0

Я уже создал симуляцию таким образом, но моя цель - в конечном итоге основать все это на законах Ньютона и Кеплера и создать более реалистичное моделирование. И для этого мне нужны векторы. Я также хочу привыкнуть к векторной математике. – RaptorDotCpp

+0

@RaptorDotCpp Ну, [эти законы] (http://en.wikipedia.org/wiki/Kepler's_laws_of_planetary_motion) анализируют движение планет в терминах угла/угловой скорости. Попытка добавления вектора, вероятно, является неправильным подходом, поскольку он обязательно перемещает землю по касательной с орбиты. Вы получаете только правильную орбиту, когда ваш шаг -> 0. Тригонометрический подход может оказаться более легким, чтобы охватить реальные законы. –

1

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

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 только devides по г, а не г^2. Проверьте https://en.wikipedia.org/wiki/Gravitational_constant для справки

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

+0

К сожалению, результат тот же (за исключением более медленной скорости, конечно). – RaptorDotCpp

+0

«земля = земля + земля», «просто опустит землю на солнце». – Inspired

Смежные вопросы