Beispiel #1
0
    private void Remove(QuadtreeNode <T> node, T value)
    {
        if (node == null)
        {
            return;
        }

        if (!node.Intersects(value.Collider))
        {
            return;
        }

        if (!node.IsLeaf())
        {
            foreach (QuadtreeNode <T> child in node.children)
            {
                Remove(child, value);
            }
        }
        else
        {
            if (node.Remove(value))
            {
                if (node.IsEmpty())
                {
                    Collapse(node);
                }
            }
        }
    }
Beispiel #2
0
 private void Collapse(QuadtreeNode <T> node)
 {
     if (node.IsLeaf())
     {
         if (node.parent != null && node.IsEmpty())
         {
             Collapse(node.parent);
         }
     }
     else
     {
         bool empty = true;
         for (int i = 0; i < 4 && empty; i++)
         {
             if (!node.children[i].IsLeaf() || !node.children[i].IsEmpty())
             {
                 empty = false;
             }
         }
         if (empty)
         {
             node.children = new QuadtreeNode <T> [4];
             if (node.parent != null)
             {
                 Collapse(node.parent);
             }
         }
     }
 }
Beispiel #3
0
 private void DrawNode(QuadtreeNode <int> node, int nodeDepth = 0)
 {
     if (!node.IsLeaf())
     {
         foreach (var subNode in node.Nodes)
         {
             DrawNode(subNode, nodeDepth + 1);
         }
     }
     Gizmos.color = Color.Lerp(minColor, maxColor, nodeDepth / (float)depth);
     Gizmos.DrawWireCube(node.Position, new Vector3(1, 1, 0.1f) * node.Size);
 }
Beispiel #4
0
    private void FindCollisions(QuadtreeNode <T> node, HashSet <Manifold> collisionSet)
    {
        if (node == null)
        {
            return;
        }

        if (node.IsLeaf())
        {
            node.GetCollisions(collisionSet);
        }
        else
        {
            foreach (QuadtreeNode <T> child in node.children)
            {
                FindCollisions(child, collisionSet);
            }
        }
    }
Beispiel #5
0
    private void Insert(QuadtreeNode <T> node, T value)
    {
        if (node == null || !node.Intersects(value.Collider))
        {
            return;
        }

        if (node.Size <= minSize)
        {
            node.AddObject(value);
        }
        else
        {
            if (node.IsLeaf())
            {
                Split(node);
            }

            for (int i = 0; i < 4; i++)
            {
                Insert(node.children[i], value);
            }
        }
    }