void SetLeafToChildren(QuadtreeLeafBasic <T> leaf)
        {
            Debug.Log("位置在(" + _field.top + "," + _field.right + "," + _field.bottom + "," + _field.left + ")的树枝节点向子节点存入位置在" + leaf.position + "的叶子");

            /*
             *  如果叶子在子节点的范围里,向这个子节点里存入叶子
             *  用 else if 的原因是 Field.Contains 把边缘处的点也算在范围里,这如果一个叶子在两个节点的交界处只用一个 if 就会重复存入
             */
            if (_upperRightChild._field.Contains(leaf.position))
            {
                _upperRightChild.SetLeaf(leaf);
            }
            else if (_lowerRightChild._field.Contains(leaf.position))
            {
                _lowerRightChild.SetLeaf(leaf);
            }
            else if (_lowerLeftChild._field.Contains(leaf.position))
            {
                _lowerLeftChild.SetLeaf(leaf);
            }
            else if (_upperLeftChild._field.Contains(leaf.position))
            {
                _upperLeftChild.SetLeaf(leaf);
            }
        }
 /*
  *  移除叶子
  *
  *  移除叶子很简单,先是跟插入叶子时一样根据坐标找到叶子所在的树梢,之后直接移除就可以了。
  */
 public void RemoveLeaf(QuadtreeLeafBasic <T> leaf)
 {
     if (DontHaveChildren())
     {
         RemoveLeafFromSelf(leaf);
     }
     else
     {
         RemoveLeafFromChildren(leaf);
     }
 }
 /*
  *  存入叶子
  *
  *  首先来解决一个用词混乱的问题:
  *      在二叉树里没有子节点的节点称为“叶子节点”或“叶子”,因为他们处于树的末端,在树的结构看来就是叶子一样。这样命名后就得到了子节点的节点是“树枝”、没有子节点的节点是“叶子”的形象命名。
  *      但在四叉树里这个命名方式行不通————四叉树里的“叶子”指的是联系碰撞器和树之间的映射对象,是和节点完全不同的类。
  *      因此我们将四叉树里有子节点的节点称为“树枝”或“树干”他们只负责构成四叉树,不负责储存叶子;处于四叉树末端的没有子节点的节点称为“树梢”,他们负责存储叶子;“叶子”则是映射对象,这样就形成了“树干”连接“树梢”,“树梢”连接“叶子”的形象命名。
  *      而没有父节点的那个节点和二叉树一样称为“根”或“根节点”
  *
  *  存入叶子的流程是:
  *      先判断这个节点有没有子节点,没有的话说明是树梢,直接存入叶子就行。
  *      如果这个节点有子节点,则说明这是树枝,要向下寻找可以存入这个叶子的子节点。
  *          寻找可以存入子节点的叶子的方法很简单:如果叶子的位置到在子节点的区域里,则说明可以存进去。
  *          如此向下递归知道树梢再存进去就可以了。
  */
 public void SetLeaf(QuadtreeLeafBasic <T> leaf)
 {
     if (DontHaveChildren())
     {
         SetLeafToSelf(leaf);
     }
     else
     {
         SetLeafToChildren(leaf);
     }
 }
        void RemoveLeafFromChildren(QuadtreeLeafBasic <T> leaf)
        {
            Debug.Log("位置在(" + _field.top + "," + _field.right + "," + _field.bottom + "," + _field.left + ")的树枝节点从子节点移除位置在" + leaf.position + "的叶子");

            if (_upperRightChild._field.Contains(leaf.position))
            {
                _upperRightChild.RemoveLeaf(leaf);
            }
            if (_lowerRightChild._field.Contains(leaf.position))
            {
                _lowerRightChild.RemoveLeaf(leaf);
            }
            if (_lowerLeftChild._field.Contains(leaf.position))
            {
                _lowerLeftChild.RemoveLeaf(leaf);
            }
            if (_upperLeftChild._field.Contains(leaf.position))
            {
                _upperLeftChild.RemoveLeaf(leaf);
            }
        }
        void RemoveLeafFromSelf(QuadtreeLeafBasic <T> leaf)
        {
            _leafs.Remove(leaf);

            Debug.Log("位置在(" + _field.top + "," + _field.right + "," + _field.bottom + "," + _field.left + ")的树梢节点移除位置在" + leaf.position + "的叶子");
        }
 void SetLeafToSelf(QuadtreeLeafBasic <T> leaf)
 {
     _leafs.Add(leaf);
     CheckAndDoSplit();
     Debug.Log("位置在(" + _field.top + "," + _field.right + "," + _field.bottom + "," + _field.left + ")的树梢节点存入位置在" + leaf.position + "的叶子");
 }
예제 #7
0
 private void Awake()
 {
     _leaf = new QuadtreeLeafBasic <GameObject>(gameObject, GetLeafPosition());
 }
예제 #8
0
 public static void RemoveLeaf(QuadtreeLeafBasic <GameObject> leaf)
 {
     _quadtree.RemoveLeaf(leaf);
 }
예제 #9
0
 /*
  *  存入。移除。检测三个方法都是 static ,因为static方法可以通过类名调用,这样就省去了每个检测器都要 Find 一次四叉树物体的工作
  */
 public static void SetLeaf(QuadtreeLeafBasic <GameObject> leaf)
 {
     _quadtree.SetLeaf(leaf);
 }