Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 二维空间中对象的高效数据结构_Algorithm_Data Structures_2d_Complexity Theory_Collision Detection - Fatal编程技术网

Algorithm 二维空间中对象的高效数据结构

Algorithm 二维空间中对象的高效数据结构,algorithm,data-structures,2d,complexity-theory,collision-detection,Algorithm,Data Structures,2d,Complexity Theory,Collision Detection,我有一个包含对象的2D空间,每个对象都有坐标向量和相对于其坐标的顶点数组,现在我需要一种有效的存储对象的方法,该存储应该能够添加和删除对象,最重要的部分是碰撞检测: 我想得到一个有机会碰撞(近邻等)的物体列表,应该是快速简单的 O([number of objects with collish chance]*log([number of all objects])这样,当没有接近的对象时,它应该在O(1)中进行操作,而不是在O(n)中对所有对象进行强制操作 询问是否有不清楚的事情 也许你知道一

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

我想得到一个有机会碰撞(近邻等)的物体列表,应该是快速简单的

O([number of objects with collish chance]*log([number of all objects])
这样,当没有接近的对象时,它应该在
O(1)
中进行操作,而不是在
O(n)
中对所有对象进行强制操作

询问是否有不清楚的事情

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


谢谢。

而且两者都提供高效的2D碰撞检测。您可以使用它们中的一个,也可以只检查它们的源代码。

您可以通过使用二进制空间分区来使用树数据结构,下面是一个关于它的示例。据我所知,这是在n维空间中存储物体位置信息的最有效方法

下面是它的工作原理:假设您有以下字段

假设你有一个100x100的空间

这里有6个物体,坐标从A到F A(25,25) B(25,75), C(25,85), D(75,75), E(90,60)

现在,我们将空间划分为4个部分,每个部分都是树中根节点的子节点。左上角仅包含点A,因此这是一个带有一个叶节点的chield。 左下角包含两个对象,B和C,因此它们将是第二个chield的叶节点。
现在右下角将有3个元素,这是我们不想要的,因为二叉树的概念,所以我们进行另一个细分。通过递归地执行此操作,您可以获得一个非常有效的数据结构,用于在二维空间中查找对象。

您可以使用a来检查所有附近的对象。

您希望使用空间索引或四叉树。四叉树可以是简单的空间填充曲线(sfc)或希尔伯特曲线。sfc将2d复杂度降低为1d复杂度,并用于许多贴图应用程序或热贴图。sfc也可以用来存储zipcode搜索。你想搜索尼克的希尔伯特曲线四叉树空间索引博客