模拟分离力量n个物体

时间:2014-05-14 20:33:31

标签: performance algorithm simulation physics

我正在为在屏幕上走动的小生物写一个模拟。我遇到的一个问题是它们有时会变得太近 - 我认为解决这个问题的一种方法就是有一定的阈值距离,当任何两个生物比这个距离更近时,力就会将它们分开。

然而,在我实现这个之前,我想知道除了蛮力enter image description here解决方案之外是否还有任何已知的算法。

我一直在研究一些不同的算法,其中一个值得注意的是Barnes-Hut算法,该算法在enter image description here时运行 - 但是,我不确定这是否适用于此问题。< / p>

感谢任何帮助

2 个答案:

答案 0 :(得分:5)

Barnes-Hut和变体是执行此操作的常用方法,但我不会为您的用例实现完整算法,因为它似乎有点过分。我可能只是将平面划分为正方形网格,比如20 x 20,并为每个单元格维护一组,当前所有生物都位于单元格内。然后,对于每个生物,只需查看其细胞和相邻细胞中的8(或侧面5或角落中的3),并使用在一个细胞长度内降至零的力。

有一个明显的权衡 - 一个更精细的网格意味着需要考虑更少的生物对,但是你必须更频繁地将它们从一个细胞移动到另一个细胞。细胞长度小于力的范围是没有用的,因为你不仅要考虑8个邻居,还要考虑超出它们的力量范围内的细胞。

答案 1 :(得分:2)

将您的身体网格化为树状结构,使用四叉树进行2D和八叉树进行3D。 O(n log n)算法背后的想法是对每个正文进行log n比较而不是n比较。如果您的实体聚类成组,则可以计算聚类的平均质量和位置。不是来自该组中每个身体的力量作用于身体,而是等效伪体的单一合力作用于另一个身体。我相信这是Barnes-Hut背后的想法。

你需要一个快速算法来识别你的星团,确定你何时可以牺牲模拟速度的速度(将木星和它的卫星分组为一个伪体来计算地球上的引力可能是可以的。将木星和土星分组为一个伪体来计算地球上的引力是不行的。

群集越大,准确度就越低。然而,较大的群集也意味着需要进行较少的身体比较。您可能还希望优化可以重用于其他实体的群集。将所有内行星与太阳分组可能可以计算所有外太阳系天体上的力。

在您进入复杂的O(n^2)实施之前,先从天真的O(n log n)方法开始。当你准备好了,网上有很多关于n体模拟的伟大文献。