给定二维空间中的一组 n 个粒子,其中每个粒子对集合中的所有其他粒子都受到吸引力,与它们之间的距离的平方反比成正比,你能想象任何计算所经历的净力的巧妙方法吗?每个粒子,不执行 n^2 距离计算?
从我的程序的粒子类:
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());
}
}
}
在遇到性能问题之前,蛮力方法只能在我的程序中模拟大约 150 个粒子(使用 XNA 框架和 Farseer 物理引擎)。
如果没有别的办法,这段代码怎么优化,不然怎么作弊?我尝试在粒子到粒子的基础上随机化对 calculateAttractions() 的调用,这样在任何给定时间,实际上只有大约 1/3 的粒子被更新。这导致了性能的一些改进,但当然是以准确性为代价的。
我正在尝试做的类似于重力计算。该线程中的某人建议使用复数并使用方程式:
(z-z')/abs(z-z')**3
但是,我不知道 z 指的是什么,我在其他任何地方都找不到这个方程的参考。
编辑:虽然我已经接受了下面的答案,但我最终使用了一个没人提到的解决方案:查找表。基本上,我预先计算了另一个粒子在任何方向上最多 2000 像素的所有距离(分辨率为 1 像素)对一个粒子施加的力。然后可以在没有任何运行时距离计算的情况下确定力。虽然它不是一个精确的解决方案,但失真是不可察觉的,它使我能够将模拟粒子的数量增加三倍(到现在数量受限于物理引擎而不是 n 体问题的程度。 )