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); } }
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); } } }
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); } } } } }