zoukankan      html  css  js  c++  java
  • 记一下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层是这样分配的

  • 相关阅读:
    Groovy Simple file download from URL
    Connect to URL and dump webpage in Groovy Stack Overflow
    bash脚本测网络流量
    HTTPBuilder Overview
    nginx设置代理账号密码
    引爆流行
    RRDtool About RRDtool
    老王 python ,
    Ubuntu下安装GeoIP
    实时查看网络的流量
  • 原文地址:https://www.cnblogs.com/AZ-ZK/p/4212882.html
Copyright © 2011-2022 走看看