在C#中实现牛顿万有引力定律

时间:2014-02-27 12:12:00

标签: c# xna physics

我试图创建行星运动的(差)模拟,使用万用万向列法计算速度,然后将它们全部加在一起计算最终运动方向。然而,当试图实施公式时,我的行星只是不移动,当在控制台上输出计算出的速度浮点数时,它表示+无穷大。继承人使用的算法:

    private void calculateVelocity()
            {
                List<Vector2> Velocities = new List<Vector2>();
                foreach (Planet p in Game1.Planets)
                {


                    Vector2 dir = Vector2.Subtract(p.Position, p.Position);
                    float radius = dir.Length();
                    float power = G * ((Mass * p.Mass) / radius);
                    float acceleration = power / Mass;
                    float velocity = acceleration * deltaTime * 0.1f;
                    //Console.WriteLine(velocity) -- Outputs random numbers and often +infinity !!!
                    dir.Normalize();
                    dir = Vector2.Multiply(Position, velocity);
                    Velocities.Add(dir);

                }
                foreach (Vector2 v in Velocities)
                {
                    Vector2.Add(Velocity, v);
                }
            }

我希望你能帮助我解决这个问题。先生,丹尼尔

修改

这是(希望)工作版本,如果有人需要这个。

private void calculateVelocity()
            {
                List<Vector2> Velocities = new List<Vector2>();
                foreach (Planet p in Game1.Planets)
                {
                    if(p.Identifier != this.Identifier)
                    {
                    Vector2 dir = Vector2.Subtract(p.Position, Position);
                    float radius = dir.Length();
                    float force = G * ((Mass * p.Mass) / ((float)Math.Pow(radius,2));
                    float acceleration = force / Mass;
                    float velocity = acceleration * deltaTime * 0.1f;
                    //Console.WriteLine(velocity) -- Outputs random numbers and often +infinity !!!
                    dir.Normalize();
                    dir = Vector2.Multiply(dir, velocity);
                    Velocities.Add(dir);
                    }
                }
                foreach (Vector2 v in Velocities)
                {
                    Vector2.Add(Velocity, v);
                }
            }

3 个答案:

答案 0 :(得分:5)

你有一个零长度方向:

Vector2 dir = Vector2.Subtract(p.Position, p.Position);

应该是

Vector2 dir = Vector2.Subtract(p.Position, Position);

或只是

Vector2 dir = p.Position - Position;

答案 1 :(得分:2)

你可能需要跳过当前的星球。您需要在foreach循环内进行测试以跳过计算中的this。否则,dir将是零向量。然后radius将为0。

另外,你的力量和力量令人困惑。这些是物理学中非常独特的概念。对于每个人,请改变它。

此外,

float power = G * ((Mass * p.Mass) / radius);

应该是:

float force = G * ((Mass * p.Mass) / radius / radius);

由于重力下降与距离的平方成反比。

然后你:

dir.Normalize();
dir = Vector2.Multiply(Position, velocity); // This overwrites dir... why normalize it first?

我猜你的意思是:

dir.Normalize();
dir = Vector2.Multiply(dir, velocity);

这些应该让你起步并运行。

答案 2 :(得分:1)

当除以零时,您可能会在浮点数上获得无穷大值。检查半径或质量是否首先具有0值...

相关问题