Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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
C++ 四叉树与红黑树在C++;?_C++_Quadtree - Fatal编程技术网

C++ 四叉树与红黑树在C++;?

C++ 四叉树与红黑树在C++;?,c++,quadtree,C++,Quadtree,多年来,我一直在网上寻找四叉树/四叉树节点的实现。有一些基本的东西,但没有什么,我可以真正使用它的游戏 我的目的是在游戏中存储对象,以便处理诸如碰撞检测之类的事情。 我不是100%确定四叉树是最好的数据结构,但从我所读到的来看,它是最好的。我已经编写了一个红黑树,但我真的不知道我的游戏的性能是否足够好(这将是一个像Ankh这样的冒险第三人称游戏) 如何在C++中编写一个基本但完整的四叉树类(或八叉树)? 如何使用四叉树进行碰撞?使用四叉树的原因是,您可以在x和y坐标上拆分,在x、y和z坐标上拆分

多年来,我一直在网上寻找四叉树/四叉树节点的实现。有一些基本的东西,但没有什么,我可以真正使用它的游戏

我的目的是在游戏中存储对象,以便处理诸如碰撞检测之类的事情。 我不是100%确定四叉树是最好的数据结构,但从我所读到的来看,它是最好的。我已经编写了一个红黑树,但我真的不知道我的游戏的性能是否足够好(这将是一个像Ankh这样的冒险第三人称游戏)

如何在C++中编写一个基本但完整的四叉树类(或八叉树)?
如何使用四叉树进行碰撞?

使用四叉树的原因是,您可以在x和y坐标上拆分,在x、y和z坐标上拆分八叉树,从而使碰撞检测变得简单

四叉树:如果元素不在左上角,它不会与右上角、左下角或右下角的元素发生碰撞

它是一个非常基本的类,所以我不理解您在发现的实现中缺少了什么


我不会写这样的类,我只是从一个有合适许可证的项目中借用它。

红黑树不是空间索引;它只能在单个序数键上排序。四叉树(对于二维)是一种空间索引,允许快速查找和消除点。八叉树对三维空间也有同样的作用。

当您只需要存储平面上的有效内容时,可以使用四叉树。就像经典RTS中的单位,它们都在地面上,或者仅仅在地面上一点点。基本上,每个节点都有到4个子节点的链接,这些子节点将节点的空间分成均匀分布的四分之一

八叉树的作用是相同的,但在所有三维空间中,而不仅仅是两个,因此它们有8个子节点,并将空间划分为8个子节点。当游戏实体在所有三个维度中分布更均匀时,应使用它们

如果要查找二叉树(如红黑树),则需要使用称为二进制空间分区树(BSP树)的数据结构或称为KD树的数据结构版本。这些使用平面将空间分成两半,在KD树中,平面是正交的(在XZ、XY、ZY轴上),因此有时在3D场景中效果更好。BSP树使用任何方向的平面将场景分割开来,但它们非常有用,早在Doom就被使用过

因为你已经划分了游戏空间,你现在不必测试每个游戏实体和其他游戏实体是否冲突,这是一个O(n^2)算法。而是查询数据结构以返回游戏空间子区域内的游戏实体,并仅对这些节点彼此执行冲突检测

这意味着所有游戏实体的碰撞检测都应该是n O(nlogn)操作(最坏情况下)

需要注意的几个额外事项:

  • 确保从相邻节点测试游戏实体,而不仅仅是当前节点中的实体,因为它们仍然可能发生碰撞
  • 在实体移动后重新平衡数据结构,因为现在数据结构中可能有空节点,或者包含太多实体以获得良好性能的节点(也是所有实体位于同一节点中的退化情况)

一般来说,树在这方面是有问题的,因为插入的任何项目都可能位于边界上,所有处理这种情况的方法都相当不令人满意

您很可能希望将对象分为可移动对象和静态对象,并对照静态对象检查在给定帧上移动的任何对象


BSP树是静态几何体(通过将对象拆分为两部分来处理边界情况)的公认解决方案,对于动态几何体,请尝试排序和扫描(也称为扫描和修剪)。

我强烈建议您使用渲染引擎,例如Ogre3D。据我所知,它支持用于场景管理的八叉树。但是您可以根据需要扩展基于八叉树的类。我过去常常自己编写所需的代码,但对于复杂的项目来说,这不是正确的方法。

现在STANN是最好的开源实现


这有点模糊。我认为树实现需要知道您想要存储什么类型的数据,因为这会影响insert如何工作(拆分等)的细节。四叉树的要点不是快速遍历树,而是首先避免遍历。