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

如何解决二维空间中对象的有效数据结构

| 我有一个带有对象的2D空间,每个对象都有坐标矢量和相对于他的坐标的顶点数组,现在我需要一种高效的对象存储方式,该存储应该能够添加删除对象,也是最重要的部分是碰撞检测: 我想获得一个有可能碰撞的对象的列表(近邻等),应该快速简单
O([number of objects with collision chance] * log([number of all objects]))
这样,当没有靠近的对象时,应在
O(1)
中进行操作,而不是用蛮力方式仅遍历
O(n)
中的所有对象。 询问是否不清楚。 也许您知道有关该主题链接或任何好的想法。 谢谢。     

解决方法

Chipmunk Physics和Box2D均提供有效的2D碰撞检测。您可以使用其中之一,也可以只检查其来源。     ,您可以为此使用四叉树来检查所有附近的物体。     ,您可以通过使用二进制空间分区来使用树数据结构,这是有关它的维基百科文章。据我所知,这是在n维空间中存储有关对象位置信息的最有效方法。 它是这样工作的:假设您有以下字段 假设您有100x100的空间。 您在其中有6个对象,坐标为A到F A(25,25) B(25,75), C(25,85), D(75,75), E(90,60) 现在,我们将空间分为四个部分,每个部分将是树中根节点的子节点。左上角仅包含点A,因此这是一个叶节点的产量。 左下角包含2个对象B和C,因此它们将成为第二个对象的叶节点。 现在右下角将包含3个元素,由于二叉树的想法,我们不希望使用这3个元素,因此我们进行了另一个细分。通过递归执行此操作,您将获得一个非常有效的数据结构,用于在2D空间中查找对象。     ,您要使用空间索引或四叉树。四叉树可以是简单的空间填充曲线(sfc)或希尔伯特曲线。 sfc将2d复杂度降低到1d复杂度,并在许多地图应用程序或热图中使用。 sfc也可以用于存储邮政编码搜索。您要搜索尼克的希尔伯特曲线四叉树空间索引博客。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?