我有大量的物体(球,一开始)在空间中逐步移动,一次一个,并且不应重叠。目前,我检查每一个动作是否与其他物体发生碰撞。 Several other questions here处理此事,但是,我想到了一个看似简单的解决方案,似乎没有出现在这种背景下,我想知道为什么。< / p>
为什么不简单地保留所有对象的2个集合(对于二维或三维三维),分别按x和y(和z)坐标排序,并且在每次移动时查找给定距离内的所有其他对象(每个尺寸的球直径)并仅对两个(或所有3个)结果集中的对象进行实际碰撞检查?
我意识到这只适用于大小相同的对象,但也可以使用两倍的集合,按每个维度的每个对象的(1)最高(2)最低坐标排序。与从O(n)“成对检查”到“grid method”或“quad / octrees”相比,这不起作用的原因,或者显着减少了什么?我看到这些已排序集合的更新是这里代价高昂的操作,但是使用例如一个TreeSet(我的实现将使用Java)它应该仍然明显小于O(n),对吧?
答案 0 :(得分:2)
检查两个结果集中的对象是否涉及查看平面的两个条带中的所有对象。这是一个更大的区域,因此涉及更多的对象,而四边形允许您立即缩小到的封闭方块。更多的对象意味着它更慢。
答案 1 :(得分:1)
您想要使用空间索引或空间填充曲线而不是四叉树。 sfc将2d复杂度降低到1d复杂度并且与quadtree不同,因为它每x,y对只能存储1个对象?也许这适合你的问题?你想搜索尼克的希尔伯特曲线四叉树空间索引博客。