用于移动物体的空间数据结构?

2024-04-21

我想知道处理大量移动对象(球体、三角形、盒子、点等)的最佳数据结构是什么?我试图回答两个问题,最近邻和碰撞检测。

我确实意识到,传统上,像 R 树这样的数据结构用于最近邻查询,Oct/Kd/BSP 用于处理静态对象或很少移动对象的碰撞检测问题。

我只是希望还有其他更好的东西。

我感谢所有的帮助。


  1. 您可以将场景划分为八叉树并利用场景一致性。您正在测试的移动对象将在树的特定节点中持续特定数量的帧,具体取决于其速度。这意味着您可以假设它将在节点中,因此可以快速删除许多不在节点中的对象。当然,棘手的一点是当您的对象靠近分区边缘时,您必须确保更新对象所在的节点。

  2. 运动的物体有方向和速度。您可以通过使用对象移动方向的垂直划分轻松地将场景分为两部分。不需要检查位于该划分错误一侧的任何对象。当然要补偿其他物体的速度。因此,如果另一个对象相当慢,您可以轻松地将其从进一步检查中删除。

  3. 始终使用轴对齐边界框之类的东西来简化您正在测试的任何形状。初始碰撞测试

  4. 您可以计算物体与另一个移动物体之间的距离加上速度。如果另一个移动物体以更快的速度沿相同的方向移动,您可以将其从检查中消除。

  5. 根据对象的形状,还有许多其他优化。圆形、正方形或更复杂的形状都可以在移动时进行特定的优化。

  6. 假设某些对象确实停止或可以停止移动,您可以跟踪停止的对象。这些对象可以像静态对象一样对待,因此检查速度更快,并且您可以对它们应用所有静态优化技术。

  7. 我知道更多,但一时想不起来。有一段时间没做这个了。

当然,这取决于您如何进行碰撞检测。您是否根据速度增量更新对象的位置并检查它是否是静态的。或者您是否通过挤压形状并计算出初始碰撞点来补偿速度。前者对于快速移动的物体需要一小步。后者更复杂且成本更高,但效果更好。另外,如果你要旋转物体,那么事情就会变得更加棘手。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于移动物体的空间数据结构? 的相关文章

  • 查找数组中的 K 个最小值(堆 vs QuickSelect)

    假设我们有一个数组 我们希望找到它的 K 个最小值 有两种方法 1 使用快速选择算法 O n 时间复杂度和O 1 空间 2 使用最小堆数据结构 O NlogK 时间复杂度和O K 空间 我想知道什么时候一个比另一个更受青睐 我想这两个都可以
  • 查找椭圆或贝塞尔曲线上的等距点

    目前我正在编写 JavaScript 代码 将对象放置在屏幕上的椭圆上 我试图找到能够解决这个问题之一的算法 椭圆将是完美的 但如果它太昂贵 贝塞尔曲线也可以 抱歉 但不幸的是我的数学不允许我使用我找到的答案 https mathoverf
  • 笛卡尔坐标到极坐标

    看一下这里的例子 http www brianhare com physicals so html http www brianhare com physics so html 看一下 console log 我在其中使用了这两个主要函数
  • Unity3D 播放器在石头上行走

    大家好 我的玩家正在石头上行走并穿过石头 名为 Champ 的玩家有一个 Box Collider 而 Stone 有一个 Mesh Collider 玩家也有刚体 我尝试了我发现的一切 但没有任何帮助我解决我的问题 MovePlayer
  • 如何在 C# 中创建真正不可变的双向链表?

    这更多的是一个理论问题 在 C 中是否可以通过任何方式创建一个真正不可变的双向链表 我认为一个问题在于两个相邻节点的相互依赖 我所说的 真正 是指使用只读字段 这可以通过棘手的构造函数逻辑来完成 例如 public sealed class
  • 如何将多个矩形打包为 2d 盒子俄罗斯方块样式

    我有许多不同宽度和高度的矩形 我有一个更大的矩形平台来放置它们 我想将它们包装在平台的一侧 以便它们在纵向 X 尺寸上展开 但将横向 Y 尺寸保持在最小限度 就是把它们像俄罗斯方块游戏一样放置 不能有重叠 但可以有间隙 有没有算法可以做到这
  • 查找二维空间中圆内的所有点

    我表示我的 2D 空间 考虑一个窗口 其中每个像素显示为 2D 数组中的一个单元格 即 100x100 的窗口由相同维度的数组表示 现在给定窗口中的一个点 如果我画一个半径的圆r 我想找到该圆圈中的所有点 我想我应该检查半径周围方形区域中的
  • 如何在javascript中实现deque数据结构?

    我正在用 javascript 学习数据结构 我现在的重点是如何实现双端队列 编辑 从下面的评论中我得到了有关如何实施的有用指示deque based array 有没有一个具体实施的方向deque based object使用类 我明白了
  • 如何在 O(n) 时间内遍历二叉树而不需要额外的内存

    给定一棵带有整数 左指针和右指针的二叉树 如何在 O n 时间和 O 1 额外内存 无堆栈 队列 递归 内遍历该树 This guy http nandacumar blogspot com 2006 06 traversing tree
  • PHP 中的 MPTT(修改的先序树遍历)问题

    我的第一篇文章在这里 看来这是一个变得明智的地方 我目前正在进行一些测试 第一次尝试使用 MPTT 修改的预序树遍历 方法在 PHP 的帮助下将数据存储在 Mysql 数据库中 但是 我试图找到最注重性能的方法来获取特定级别上的所有列表元素
  • 如何在iphone中画同心圆?

    我想画一个戒指 环应填充在外圆中 我参考了一个文档http developer apple com library mac documentation GraphicsImaging Conceptual drawingwithquartz
  • 使用 NSMutableDictionary 与 NSMutableArray 造成的性能损失>

    我正在考虑使用 NSMutableDictionary 代替我当前的 NSMutableArray 这主要是出于 KVC KVO 的原因 该集合将在我的绘图方法的内循环中经历严重的变化 如果我继续进行此替换 性能是否会受到重大影响 干杯 道
  • Android 谷歌地图圆圈平滑改变半径

    我想控制按进度条循环 但是谷歌地图APIsetRadius变化并不顺利 如何平滑改变圆半径 这是我的源代码 private Circle circle public void onMapReady final GoogleMap googl
  • 如何最小化两个子多边形的最大纵横比?

    我想使用直线将凸多边形切成给定面积比的两部分 以使两个子多边形的较大纵横比最小化 目前我的方法包括选择一个随机起点 计算将多边形分割成目标区域的适当终点 然后计算两个纵横比中较大的一个 然后重复这个很多次 直到我足够接近最小值 多边形 A
  • 比较 C# 中 DateTime 的二进制表示形式

    我有一个DateTime表示为长 8 个字节 来自DateTime ToBinary 我们称之为dateTimeBin 是否有一种最佳方法可以删除时间信息 我只关心日期 以便我可以将其与一天的开始进行比较 假设我们将此样本值作为一天的开始
  • 将非平凡函数应用于 data.table 的有序子集

    Problem 我正在尝试使用我新发现的 data table 功能 永久 来计算一堆数据的频率内容 如下所示 Sample Channel Trial Voltage Class Subject 1 1 1 196 82253 1 1 1
  • 初始化 HashMap 的最佳方法

    我通常会这样做 HashMap
  • 从 python 中的缩进文本文件创建树/深度嵌套字典

    基本上 我想迭代一个文件并将每行的内容放入一个深层嵌套的字典中 其结构由每行开头的空格数量定义 本质上 目标是采取这样的事情 a b c d e 并将其变成这样的东西 a b c d e Or this apple colours red
  • 从日志文件中获取前 100 个 URL

    我的一位朋友在接受采访时被问到以下问题 谁能告诉我如何解决它 我们有一个相当大的日志文件 大约 5GB 日志文件的每一行都包含一个用户在我们网站上访问过的 URL 我们想要找出用户访问最多的 100 个 URL 怎么做 如果我们有超过 10
  • 高维最近邻搜索的最佳数据结构

    我实际上正在处理高维数据 50 000 100 000 个特征 并且必须对其执行最近邻搜索 我知道随着维度的增长 KD 树的性能很差 而且我还了解到 一般来说 所有空间分区数据结构都倾向于对高维数据执行详尽的搜索 此外 还有两个重要事实需要

随机推荐