public CoverNode <T> AddRectangle(SpatialObj <T> rect, bool reorganize = true) { CoverNode <T> deepest_field = FindContainingField(rect, rootNode); if (deepest_field.IsFull() && !deepest_field.HasChildren()) { PartitionField(deepest_field); CoverNode <T> node = AddRectangle(rect); if (reorganize) { ReorganizeOverflownNodes(); } if (node != null) { return(node); } } else { bool overflown = deepest_field.StoreRectangle(rect); } if (deepest_field != null) { Count += 1; } return(deepest_field); }
private void ReorganizeNode(CoverNode <T> node) { // After adding objects and creating new partitions, checks to see if any of the upper level objects can go deeper into the tree. Queue <CoverNode <T> > all_nodes = new Queue <CoverNode <T> >(); all_nodes.Enqueue(node); while (all_nodes.Count > 0) { List <SpatialObj <T> > rects_removed = new List <SpatialObj <T> >(); CoverNode <T> current_node = all_nodes.Dequeue(); foreach (SpatialObj <T> rect in current_node.GetOverflowObjs()) { CoverNode <T> deepest_field = FindContainingField(rect, current_node); if (!deepest_field.Equals(current_node)) { bool overflown = deepest_field.StoreRectangle(rect); rects_removed.Add(rect); } } if (rects_removed.Count > 0) { current_node.DeleteRectangles(rects_removed, true); } if (current_node.HasChildren()) { foreach (CoverNode <T> child in current_node.GetChildren()) { all_nodes.Enqueue(child); } } } }