2D空间中对象的高效数据结构

时间:2011-05-24 11:41:59

标签: algorithm data-structures 2d complexity-theory collision-detection

我有一个带有对象的2D空间,每个对象都有坐标向量和一个相对于他坐标的顶点数组,现在我需要一种存储对象的高效方法,这个商店应该能够添加和删除对象,也就是最重要的部分是碰撞检测:

我想获得一个偶然碰撞的对象列表(近邻等),应该快速而简单

O([number of objects with collision chance] * log([number of all objects]))这样当没有关闭对象时,它应该在O(1)中进行,而不是仅仅通过O(n)遍历所有对象的蛮力方式。

询问是否有不清楚的事情。

也许你知道关于这个主题或任何好主意的一些链接。

感谢。

4 个答案:

答案 0 :(得分:3)

您可以使用quadtree来检查附近的所有物品。

答案 1 :(得分:1)

Chipmunk PhysicsBox2D都提供有效的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也可用于存储邮政编码搜索。你想搜索尼克的希尔伯特曲线四叉树空间索引博客。