假设有一组在二维空间中的 n 个粒子,每个粒子之间存在引力,且引力大小与它们之间的距离的平方成反比。你能想象出任何聪明的方法来计算每个粒子所受的净引力吗?而不需要进行 n^2 次距离计算。
从我的程序的 Particle 类中:
public void calculateAttractions(List<Particle> entities)
{
foreach (Particle p in entities)
{
if (!p.Equals(this))
{
Vector2 dx = this.Position - p.Position;
this.ApplyForce(-dx / dx.LengthSquared());
}
}
}
在我的程序中(使用XNA框架和Farseer物理引擎),暴力方法只能模拟大约150个粒子,就会遇到性能问题。
如果没有其他方法,这段代码该如何优化,或者该如何作弊?我已经尝试了按照每个粒子的基础上随机调用calculateAttractions()函数,以便在任何给定时间内只有大约1/3的粒子实际上正在更新。这导致了一些性能上的改进,但当然牺牲了精度。
我的目标类似于重力计算。在这个线程中,有人建议使用复数并使用以下公式:
(z-z')/abs(z-z')**3
然而,我不知道z指的是什么,也找不到这个方程在其他地方的参考资料。
编辑:虽然我已经接受了下面一个回答,但我最终使用了没有人提到的解决方案:查找表。基本上,我预先计算了所有距离(以1像素为分辨率)内任何方向上2000像素之外的另一粒子对一个粒子施加的力。因此,可以在没有任何运行时距离计算的情况下确定力。虽然这不是一个精确的解决方案,但失真是不可感知的,并且它使我能够将模拟粒子的数量增加三倍(现在数量受物理引擎而不是n-体问题限制)。