Exemplo n.º 1
0
        private void InsertNodeObject(QuadNode node, T quadObject)
        {
            lock (syncLock)
            {
                if (!node.Bounds.Encloses(quadObject.Bounds))
                {
                    throw new Exception("This should not happen, child does not fit within node bounds");
                }

                if (!node.HasChildNodes() && node.Objects.Count + 1 > maxObjectsPerLeaf)
                {
                    SetupChildNodes(node);

                    List <T> childObjects       = new List <T>(node.Objects);
                    List <T> childrenToRelocate = new List <T>();

                    foreach (T childObject in childObjects)
                    {
                        foreach (QuadNode childNode in node.Nodes)
                        {
                            if (childNode == null)
                            {
                                continue;
                            }

                            if (childNode.Bounds.Encloses(childObject.Bounds))
                            {
                                childrenToRelocate.Add(childObject);
                            }
                        }
                    }

                    foreach (T childObject in childrenToRelocate)
                    {
                        RemoveQuadObjectFromNode(childObject);
                        InsertNodeObject(node, childObject);
                    }
                }

                foreach (QuadNode childNode in node.Nodes)
                {
                    if (childNode != null)
                    {
                        if (childNode.Bounds.Encloses(quadObject.Bounds))
                        {
                            InsertNodeObject(childNode, quadObject);
                            return;
                        }
                    }
                }

                AddQuadObjectToNode(node, quadObject);
            }
        }
Exemplo n.º 2
0
        public void UpdateBounds(T quadObject)
        {
            QuadNode node = objectToNodeLookup[quadObject];

            if (!node.Bounds.Contains(quadObject.Bounds) || node.HasChildNodes())
            {
                RemoveQuadObjectFromNode(quadObject);
                Insert(quadObject);
                if (node.Parent != null)
                {
                    CheckChildNodes(node.Parent);
                }
            }
        }
Exemplo n.º 3
0
 void quadObject_BoundsChanged(object sender, EventArgs e)
 {
     lock (syncLock)
     {
         T quadObject = sender as T;
         if (quadObject != null)
         {
             QuadNode node = objectToNodeLookup[quadObject];
             if (!node.Bounds.Contains(quadObject.Bounds.Rectangle) || node.HasChildNodes())
             {
                 RemoveQuadObjectFromNode(quadObject);
                 Insert(quadObject);
                 if (node.Parent != null)
                 {
                     CheckChildNodes(node.Parent);
                 }
             }
         }
     }
 }