用矢量模拟行星轨道

时间:2013-05-25 21:14:51

标签: c++ vectormath

为了更好地理解矢量的工作原理,我试图创建一个围绕太阳运行的非常简单的地球模拟。目前,我想要的只是地球围绕太阳转圈。没有考虑物理定律。

我认为我所做的事情会起作用,但它会产生一种进入斐波那契旋转的运动。

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

}

我的计算有什么问题?

2 个答案:

答案 0 :(得分: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的起始值,增量等。

答案 1 :(得分: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 = g m1 m2 / r ^ 2.我怀疑你的{ {1}}仅由 r 而不是 r ^ ^ 2.检查https://en.wikipedia.org/wiki/Gravitational_constant以供参考

  3. 你的地球不一定会围成一圈。它很可能是一个椭圆轨道。还要确保选择足够小的步长。每次迭代,normalize只应改变其与太阳距离的一小部分,否则您将积累明显的积分误差。