高效八叉树octree:基于hash函数的数据结构

本文介绍了八叉树作为一种递归、轴对齐的空间分隔数据结构,用于优化碰撞检测和最邻近搜索。文章详细讨论了传统基于指针的节点表达方式和更高效的基于index及哈希函数的表达形式,后者能节省内存和遍历消耗。内容包括位置编码、树遍历以及如何根据位置编码进行八叉树的上下移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.基础知识

八叉树octree是一种递归、轴对齐且空间分隔的数据结构,常用于计算机几何来优化碰撞检测、最邻近搜索等,且常用于3D数据的表达。

一个八叉树结构,将有限的三维体数据等分为8个octants。octants也被称为nodes(节点,树结构概念中)或者cells(单元,空间概念中)。将空间分成等大小的立方体可以加速细分运算,且单元大小的存储也节省空间。


一个八叉树是通过递归的将空间细分成八个子单元,直到每个单元中剩余空间的大小在预定权值下,或者达到了最大树深度。每个单元都被单个轴对齐的平面细分的,类似于空间坐标系,其原点通常放在父节点的中心位置。(此处可思考不放在中心会怎么样)

因此,每个节点都可以有0或8个子节点。因此,相较于正常的网格结构,便于存储稀疏分布的结构。

2.octree的节点表达形式

传统基于指针的节点表达:

常用于octree需要频繁更新且内存消耗可以忍受的情况。通常,该节点结构体(104 byte)为:

// standard representation (104 byte)
struct OctreeNode
{
    OctreeNode * Children[8];//8个子节点指针
    OctreeNode * Parent; // optional 父节点指针
    Object *     Objects;//物体指针
    Vector3      Center;//中心位置vector
    Vector3      HalfSize;//octan大小vector
};

位于中间位置的节点以上都有,但叶节点没有子节点。因此,还常常加一项bool Isleaf;

稍微节约一点的方式:不存储每个节点的指针,而是将8个子节点连续存储成一个块,只需要存储开头的指针就好了:


其结构体(49 byte):

// block
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值