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)