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

}

我的计算出了什么问题?

4

2 回答 2

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、增量等。

于 2013-05-25T21:22:16.297 回答
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。我怀疑您的normalize唯一设计是r,而不是r ^ 2。请查看https://en.wikipedia.org/wiki/Gravitational_constant以供参考

你的地球不一定会转一圈。它很可能是一个椭圆轨道。还要确保选择足够小的步长。每次迭代,earth应该只改变它到太阳距离的一小部分,否则你会累积明显的积分错误。

于 2013-05-25T21:22:22.843 回答