我正在尝试使用万有引力定律创建行星运动的(简陋)模拟,利用该定律计算速度,然后将所有速度相加以计算最终运动方向。但是,在尝试实现公式时,我的行星根本不动,而在控制台输出计算出的速度浮点数时,它显示为+无穷大。下面是我使用的算法:
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);
}
}
我希望您能帮我解决这个问题。谢谢,Daniel。
编辑
以下是(希望)正常工作的版本,以防有人需要。
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);
}
}
= G * p.Mass / radius
。deltaTime
有有效值吗? - Nico SchertlerF = m * a
,你会得到a = F / m
,这之后我用它来计算速度。deltaTime小于1,但从未为0或负数。 - tubberdradius
、Mass
、p.Mass
和velocity
,以查看哪些情况下这些值变得不合理。公式是正确的。如果a = F / m
且F = G * m * m' / r
,则a = G * m * m' / (r * m)
,因此a = G * m' / r
。加速度与自身质量无关。 - Nico Schertler