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); } } }
public void Add(T item) { QuadTreeObject <T> wrappedObject = new QuadTreeObject <T>(item); wrappedDictionary.Add(item, wrappedObject); quadTreeRoot.Insert(wrappedObject); }
private void Add(QuadTreeObject <T> item) { if (objects == null) { objects = new List <QuadTreeObject <T> >(); } item.Owner = this; objects.Add(item); }
internal void Move(QuadTreeObject <T> item) { if (item.Owner != null) { item.Owner.Relocate(item); } else { Relocate(item); } }
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); } } }
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); } } }
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); } } }
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); }