我有一个带有对象的2D空间,每个对象都有坐标向量和一个相对于他坐标的顶点数组,现在我需要一种存储对象的高效方法,这个商店应该能够添加和删除对象,也就是最重要的部分是碰撞检测:
我想获得一个偶然碰撞的对象列表(近邻等),应该快速而简单
O([number of objects with collision chance] * log([number of all objects]))
这样当没有关闭对象时,它应该在O(1)
中进行,而不是仅仅通过O(n)
遍历所有对象的蛮力方式。
询问是否有不清楚的事情。
也许你知道关于这个主题或任何好主意的一些链接。
感谢。
答案 0 :(得分:3)
您可以使用quadtree来检查附近的所有物品。
答案 1 :(得分:1)
Chipmunk Physics和Box2D都提供有效的2D碰撞检测。您可以使用其中一个,也可以只检查其来源。
答案 2 :(得分:1)
您可以使用二进制空间分区来使用树数据结构,这里有一个wikipedia article。这是我知道的最有效的方法,即存储有关n维空间中物体位置的信息。
以下是它的工作原理:假设你有以下字段
假设您的空间为100x100。
你有6个物体,坐标名为A到F. A(25,25) B(25,75), C(25,85), d(75,75), E(90,60)
现在,我们将空间分为4个部分,每个部分将是树中根节点的子节点。左上角只包含A点,所以这是一个有一个叶子节点的chield。 左下角包含2个对象,B和C,因此它们将是第二个chield的叶节点。 现在右下角将有3个元素,由于二元树的想法,我们不想要它们,因此我们进行另一个细分。通过递归执行,您可以获得一个非常有效的数据结构,用于在2D空间中查找对象。
答案 3 :(得分:1)
您想要使用空间索引或四叉树。四叉树可以是简单的空间填充曲线(sfc)或希尔伯特曲线。 sfc将2d复杂度降低到1d复杂度,并在许多地图应用程序或热图中使用。 sfc也可用于存储邮政编码搜索。你想搜索尼克的希尔伯特曲线四叉树空间索引博客。