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

tub*_*erd 3 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);
                }
            }
Run Code Online (Sandbox Code Playgroud)

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

编辑

这是(希望)工作版本,以防任何人需要这个.

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);
                }
            }
Run Code Online (Sandbox Code Playgroud)

Nic*_*ler 5

你有一个零长度的方向:

Vector2 dir = Vector2.Subtract(p.Position, p.Position);
Run Code Online (Sandbox Code Playgroud)

应该是

Vector2 dir = Vector2.Subtract(p.Position, Position);
Run Code Online (Sandbox Code Playgroud)

要不就

Vector2 dir = p.Position - Position;
Run Code Online (Sandbox Code Playgroud)