Octree

Inherited from NULL

Inherited by NULL

Friend class NULL

Description

Octree将空间按照八叉树的结构进行递归的细分,使用Morton码对位置坐标进行编码,从而可以快速的定位和对邻域空间的遍历与搜索(被Octree管理的数据元素必须提供计算坐标的回调函数)。Octree拥有一个唯一的根节点(深度为0),在空间里该节点可以均分为8个子空间(深度为1),即X、Y、Z均分成两部分,每个方向可以用0和1分别标识两个部分,因而可以用000到111的二进制数分别对子空间编码,这个编码即对应的Morton码,而每个子空间又可以均分为8个子空间,每个子空间在上一级的Morton码基础上再增加三位二进制数形成对应的Morton码,这样递归下去(深度逐级增加)可以按最大深度对每个子空间进行编码。Octree只对添加进来的数据创建相应的子空间(即叶节点),所以Octree比较节省内存。

Members

Public interface

Private interface


MemPool * m_pLeafPool

用于分配叶节点内存的内存池

MemPool * m_pHashPool

用于分配Hash节点的内存池

OctantHash * m_pOctantHash

叶节点Hash

int m_iLevelCount[MAX_OCTREE_LEVEL]

统计每个深度的数据个数的数组

int m_iMaxLevel

最大深度

int m_iOptLevel

优化深度,一般在这个深度的元素个数最多

double m_dBoundbox[6]

Octree所占据的立方体空间的两个角点

double m_dStep[3]

子空间按最大深度在三个方向的步长

PosGetter m_pfGetPos

用于计算元素坐标的回调函数


Octree(ulong size,double * boundary,PosGetter func )

void insertData(void * pData)

void removeData(void * pData)

void insertData(double * pos,void * pData)

void * searchData(double * pos)

void * searchNearestData(double * pos)

void searchAdjacentData(double * pos, double radius, LinkList * pTgts,bool bSort = false)

void removeData(double * pos,void * pData)

void updateOptimicalDepth()

void clear()


void insertRootLeaf()

ulong getMortonKey(double * pos,int level = MAX_OCTREE_LEVEL)

int getDepth(ulong key)

void appendData(OctreeLeaf * pLeaf, void * pData)

void removeData(ulong key,void * pData)

void removeLeaf(ulong key)

void splitLeaf(OctreeLeaf * pLeaf)

void searchData(ulong key, LinkList * pTgts)

void searchDataInradius(ulong key, double * pos,double radius,LinkList * pTgts)

void searchSortDataInradius(ulong key, double * pos,double radius,LinkList * pTgts)

ulong truncateKey(ulong key,int level)

void getIndex(ulong key,int* index)

OctreeLeaf * createLeaf(ulong key,void * pData)

int getChildCount(ulong key)

void getCenterByKey(ulong key,double * pos)