我试图创建一个(差)行星运动的模拟,使用万用引力法计算速度,然后将它们全部加在一起计算最终的运动方向.然而,当试图实现公式时,我的行星只是不移动,当在控制台上输出计算出的速度浮点数时,它表示+无穷大.继承人我使用的算法:
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)
你有一个零长度的方向:
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)
归档时间: |
|
查看次数: |
1744 次 |
最近记录: |