Ejemplo n.º 1
0
        private void Relocate(QuadTreeObject <T> item)
        {
            // Are we still inside our parent?
            if (QuadRect.Contains(item.Data.Rect))
            {
                // Good, have we moved inside any of our children?
                if (childTL != null)
                {
                    QuadTreeNode <T> dest = GetDestinationTree(item);
                    if (item.Owner != dest)
                    {
                        // Delete the item from this quad and add it to our child
                        // Note: Do NOT clean during this call, it can potentially delete our destination quad
                        QuadTreeNode <T> formerOwner = item.Owner;
                        Delete(item, false);
                        dest.Insert(item);

                        // Clean up ourselves
                        formerOwner.CleanUpwards();
                    }
                }
            }
            else
            {
                // We don't fit here anymore, move up, if we can
                if (parent != null)
                {
                    parent.Relocate(item);
                }
            }
        }
Ejemplo n.º 2
0
        public void Add(T item)
        {
            QuadTreeObject <T> wrappedObject = new QuadTreeObject <T>(item);

            wrappedDictionary.Add(item, wrappedObject);
            quadTreeRoot.Insert(wrappedObject);
        }
Ejemplo n.º 3
0
        private void Add(QuadTreeObject <T> item)
        {
            if (objects == null)
            {
                objects = new List <QuadTreeObject <T> >();
            }

            item.Owner = this;
            objects.Add(item);
        }
Ejemplo n.º 4
0
 internal void Move(QuadTreeObject <T> item)
 {
     if (item.Owner != null)
     {
         item.Owner.Relocate(item);
     }
     else
     {
         Relocate(item);
     }
 }
Ejemplo n.º 5
0
 private void Remove(QuadTreeObject <T> item)
 {
     if (objects != null)
     {
         int removeIndex = objects.IndexOf(item);
         if (removeIndex >= 0)
         {
             objects[removeIndex] = objects[objects.Count - 1];
             objects.RemoveAt(objects.Count - 1);
         }
     }
 }
Ejemplo n.º 6
0
 internal void Delete(QuadTreeObject <T> item, bool clean)
 {
     if (item.Owner != null)
     {
         if (item.Owner == this)
         {
             Remove(item);
             if (clean)
             {
                 CleanUpwards();
             }
         }
         else
         {
             item.Owner.Delete(item, clean);
         }
     }
 }
Ejemplo n.º 7
0
        internal void Insert(QuadTreeObject <T> item)
        {
            // If this quad doesn't contain the items rectangle, do nothing, unless we are the root
            if (!rect.Contains(item.Data.Rect))
            {
                System.Diagnostics.Debug.Assert(parent == null, "We are not the root, and this object doesn't fit here. How did we get here?");
                if (parent == null)
                {
                    // This object is outside of the QuadTree bounds, we should add it at the root level
                    Add(item);
                }
                else
                {
                    return;
                }
            }

            if (objects == null ||
                (childTL == null && objects.Count + 1 <= maxObjectsPerNode))
            {
                // If there's room to add the object, just add it
                Add(item);
            }
            else
            {
                // No quads, create them and bump objects down where appropriate
                if (childTL == null)
                {
                    Subdivide();
                }

                // Find out which tree this object should go in and add it there
                QuadTreeNode <T> destTree = GetDestinationTree(item);
                if (destTree == this)
                {
                    Add(item);
                }
                else
                {
                    destTree.Insert(item);
                }
            }
        }
Ejemplo n.º 8
0
        private QuadTreeNode <T> GetDestinationTree(QuadTreeObject <T> item)
        {
            // If a child can't contain an object, it will live in this Quad
            QuadTreeNode <T> destTree = this;

            if (childTL.QuadRect.Contains(item.Data.Rect))
            {
                destTree = childTL;
            }
            else if (childTR.QuadRect.Contains(item.Data.Rect))
            {
                destTree = childTR;
            }
            else if (childBL.QuadRect.Contains(item.Data.Rect))
            {
                destTree = childBL;
            }
            else if (childBR.QuadRect.Contains(item.Data.Rect))
            {
                destTree = childBR;
            }

            return(destTree);
        }