Пример #1
0
        /// <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;
        }
Пример #2
0
 /// <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);
             }
         }
     }
 }