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