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层是这样分配的