Пример #1
0
        public bool Insert(GridQuadTreeItem <T> item)
        {
            float maxSide = item.ItemRect.width >= item.ItemRect.height ? item.ItemRect.width : item.ItemRect.height;

            if (item.ItemRect.height > worldLength || item.ItemRect.width > worldLength)
            {
                Debug.LogError("Item rect too big, can not insert it");
                return(false);
            }
            int level = Mathf.FloorToInt(Mathf.Log(worldLength / maxSide, 2f));

            if (level > nodeMaxLevel)
            {
                level = nodeMaxLevel;
                Debug.LogWarning("Maybe this item is too small, but we can add it to max level.");
            }
            Vector2 itemLocalPos  = item.Position - worldRect.min;
            int     sideNodeCount = (int)Mathf.Pow(2, level);
            float   cellLength    = worldLength / sideNodeCount;
            int     column        = (int)(itemLocalPos.x / cellLength);
            int     raw           = (int)(itemLocalPos.y / cellLength);
            int     index         = raw * sideNodeCount + column;

            if (nodes[level][index].nodeRect.Contains(item.Position))
            {
                var nodeToAdd = nodes[level][index];
                if (!nodeToAdd.IsLeaf)
                {
                    var leftTop     = nodes[nodeToAdd.NodeLevel + 1][nodeToAdd.TopLeftIndex];
                    var rightTop    = nodes[nodeToAdd.NodeLevel + 1][nodeToAdd.TopRightIndex];
                    var leftBottom  = nodes[nodeToAdd.NodeLevel + 1][nodeToAdd.BottomLeftIndex];
                    var rightBottom = nodes[nodeToAdd.NodeLevel + 1][nodeToAdd.BottomRightIndex];
                    if (leftTop.looseRect.Contains(item.ItemRect))
                    {
                        nodeToAdd = leftTop;
                    }
                    else if (rightTop.looseRect.Contains(item.ItemRect))
                    {
                        nodeToAdd = rightTop;
                    }
                    else if (leftBottom.looseRect.Contains(item.ItemRect))
                    {
                        nodeToAdd = leftBottom;
                    }
                    else if (rightBottom.looseRect.Contains(item.ItemRect))
                    {
                        nodeToAdd = rightBottom;
                    }
                }
                nodeToAdd.Insert(item);
                ChangeAllParentChildrenItemCount(nodeToAdd, 1);
                Debug.Log("insert.....");
                return(true);
            }

            return(false);
        }
Пример #2
0
 protected void RemoveItem(GridQuadTreeItem <T> item)
 {
     if (items.Contains(item))
     {
         item.Move    -= ItemMove;
         item.Destroy -= ItemDestroy;
         items.Remove(item);
     }
 }
Пример #3
0
 private void ItemMove(GridQuadTreeItem <T> item)
 {
     if (looseRect.Contains(item.ItemRect))
     {
         return;
     }
     if (items.Contains(item))
     {
         if (Move != null)
         {
             Move(item, this);
         }
         RemoveItem(item);
     }
 }
Пример #4
0
 private void ItemDestroy(GridQuadTreeItem <T> item)
 {
     RemoveItem(item);
 }
Пример #5
0
 public void Insert(GridQuadTreeItem <T> item)
 {
     item.Destroy += ItemDestroy;
     item.Move    += ItemMove;
     items.Add(item);
 }
Пример #6
0
 private void ItemMove(GridQuadTreeItem <T> item, GridQuadTreeNode <T> node)
 {
     ChangeAllParentChildrenItemCount(node, -1);
     Insert(item);
 }