记一下gaia引擎的四叉树的建立方式吧

1 for (i=0; i<depth; ++i)//申请每层的所有节点
2     {
3         int nodeCount = (1<<i)*(1<<i);//表示某一层有多少节点,如底0层有1节点,也就是根节点,如底2层有16节点!
4         uint32 size = sizeof(cQuadTreeNode)*nodeCount;
5 
6         m_levelNodes[i] = (cQuadTreeNode*)new cQuadTreeNode[nodeCount];//该层的node指针
7     
8         m_memorySize += size;
9     }

其中m_levelNodes[i][j]表示第i层的的第j个节点,如第2层应该有16个节点。

 1 for (i=0; i<depth; ++i)
 2     {
 3         int levelDimension = (1<<i);
 4         int levelIndex=0;
 5         for (int y=0; y<levelDimension; ++y)
 6         {
 7             for (int x=0; x<levelDimension; ++x)
 8             {
 9                 m_levelNodes[i][levelIndex].setup(
10                     getNodeFromLevelXY(i-1, (x>>1),  (y>>1)),
11                     getNodeFromLevelXY(i+1, (x<<1),     (y<<1)),
12                     getNodeFromLevelXY(i+1, (x<<1)+1,(y<<1)),
13                     getNodeFromLevelXY(i+1, (x<<1),  (y<<1)+1),
14                     getNodeFromLevelXY(i+1, (x<<1)+1,(y<<1)+1));
15 
16                 levelIndex++;
17             }
18         }
19     }

其中getNodeFromLevelXY函数是这样的

 1 inline cQuadTreeNode* cQuadTree::getNodeFromLevelXY(int level, int x, int y)
 2 {
 3     debug_assert(isReady(), "the quad tree has not been created");
 4 
 5     if (level>=0 && level<m_depth)
 6     {
 7         return &m_levelNodes[level][(y<<level)+x];
 8     }
 9     return 0;
10 }

 

最纠结的就是这段代码了,认真看了看,他是这样建立四叉树的,例如第一层的第m_levelNodes[1][0]节点,定义它的父节点为m_levelNodes[0][0],子节点为m_levelNodes[2][0],子节点为m_levelNodes[2][1],子节点为m_levelNodes[2][4],子节点为m_levelNodes[2][5],同理呢,第一层的[1][3]节点的父节点和子节点分别为[0][0],[2][10],[2][11],[2][14],[2][15]。

也就是第2层是这样分配的

posted @ 2015-01-09 11:27  进击的小学生  阅读(136)  评论(0编辑  收藏  举报