碰撞检测复杂度<On²:比网格,四叉树,BSP更简单的方法?

问题描述

| 我有很多物体(一开始是球)在空间中逐步移动,一次只能一个,并且不会重叠。目前,对于每一个动作,我都会检查是否与其他物体发生碰撞。但是,这里还有其他几个问题可以解决这个问题,但是我想到了一个看似简单的解决方案,但似乎在这种情况下并没有提出来,我想知道为什么。 为什么不简单地保留所有对象的2个集合(用于2D或3维3个),分别按x和y(和z)坐标排序,并在每次移动中查找给定距离(球直径)内的所有其他对象此处)在每个维度上,并且仅对两个(或全部3个)结果集中的对象进行实际的碰撞检查吗? 我意识到这仅适用于大小相等的对象,但也可以使用两倍的集合,这些集合按每个维度的每个对象的(1)最高(2)最低坐标进行排序。有什么理由不起作用,或者与从O(n)“成对检查”到“网格方法”或“四元组/八叉树”相比,有什么明显的改善?我在这里将这些排序的集合的更新视为昂贵的操作,但使用例如一个TreeSet(我的实现是在Java中实现),它仍应显着小于O(n),对吗?     

解决方法

检查两个结果集中的对象均涉及查看平面两个条带中的所有对象。与四叉树可让您立即缩小到的封闭正方形相比,这是一个更大的区域,因此涉及更多对象。更多的对象意味着它比较慢。     ,您要使用空间索引或空间填充曲线,而不是四叉树。 sfc将2d复杂度降低到1d复杂度,并且与四叉树不同,因为每x,y对只能存储1个对象?也许这适合您的问题?您要搜索尼克的希尔伯特曲线四叉树空间索引博客。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...