/// <summary> /// Prunes the tree by deleting empty leaf nodes /// </summary> private void Prune() { if (m_Leaf) { return; } // Can we condense child nodes into this one? if (m_Count <= NumObjects) { if (m_NorthWest != null) { m_Objects.AddRange(m_NorthWest); m_NorthWest = null; } if (m_NorthEast != null) { m_Objects.AddRange(m_NorthEast); m_NorthEast = null; } if (m_SouthWest != null) { m_Objects.AddRange(m_SouthWest); m_SouthWest = null; } if (m_SouthEast != null) { m_Objects.AddRange(m_SouthEast); m_SouthEast = null; } m_Leaf = true; return; } bool anyChildrenAlive = false; if (m_NorthWest != null) { if (m_NorthWest.m_Count == 0) { m_NorthWest = null; } else { m_NorthWest.Prune(); anyChildrenAlive = true; } } if (m_NorthEast != null) { if (m_NorthEast.m_Count == 0) { m_NorthEast = null; } else { m_NorthEast.Prune(); anyChildrenAlive = true; } } if (m_SouthWest != null) { if (m_SouthWest.m_Count == 0) { m_SouthWest = null; } else { m_SouthWest.Prune(); anyChildrenAlive = true; } } if (m_SouthEast != null) { if (m_SouthEast.m_Count == 0) { m_SouthEast = null; } else { m_SouthEast.Prune(); anyChildrenAlive = true; } } m_Leaf = !anyChildrenAlive; }
/// <summary> /// Inserts the given object into the appropriate child node. /// Assumes the given object is within the trees <see cref="m_Region"/> /// </summary> private void InsertIntoChildren(T obj) { if (obj.Position.X < m_Region.Left + (m_Region.Width / 2)) { if (obj.Position.Y < m_Region.Top + (m_Region.Height / 2)) { if (m_NorthWest == null) { m_Leaf = false; m_NorthWest = new QuadTree <T>( new FloatRect(m_Region.Left, m_Region.Top, m_Region.Width / 2, m_Region.Height / 2), obj); } else { m_NorthWest.Insert(obj); } } else { if (m_SouthWest == null) { m_Leaf = false; m_SouthWest = new QuadTree <T>( new FloatRect(m_Region.Left, m_Region.Top + m_Region.Height / 2, m_Region.Width / 2, m_Region.Height / 2), obj); } else { m_SouthWest.Insert(obj); } } } else { if (obj.Position.Y < m_Region.Top + (m_Region.Height / 2)) { if (m_NorthEast == null) { m_Leaf = false; m_NorthEast = new QuadTree <T>( new FloatRect(m_Region.Left + m_Region.Width / 2, m_Region.Top, m_Region.Width / 2, m_Region.Height / 2), obj); } else { m_NorthEast.Insert(obj); } } else { if (m_SouthEast == null) { m_Leaf = false; m_SouthEast = new QuadTree <T>( new FloatRect(m_Region.Left + m_Region.Width / 2, m_Region.Top + m_Region.Height / 2, m_Region.Width / 2, m_Region.Height / 2), obj); } else { m_SouthEast.Insert(obj); } } } }