private void AddToTree(Tuple <T, IntegerBoundingBox> Item, int SubdivideThreshold) { if (!Bounds.Intersects(Item.Item2)) { return; } if (Children != null) { for (var i = 0; i < 8; ++i) { Children[i].AddToTree(Item, SubdivideThreshold); } } else if (Items.Count == SubdivideThreshold && Bounds.Width > 8) { Subdivide(); for (var i = 0; i < Items.Count; ++i) { for (var c = 0; c < 8; ++c) { Children[c].AddToTree(Items[i], SubdivideThreshold); } } for (var c = 0; c < 8; ++c) { Children[c].AddToTree(Item, SubdivideThreshold); } Items.Clear(); } else { Items.Add(Item); } }
public void FindItemsInBox(IntegerBoundingBox SearchBounds, HashSet <T> results) { if (SearchBounds.Intersects(Bounds)) { if (Children == null) { for (var i = 0; i < Items.Count; ++i) { if (Items[i].Item2.Intersects(SearchBounds)) { results.Add(Items[i].Item1); } } } else { for (var i = 0; i < 8; ++i) { Children[i].FindItemsInBox(SearchBounds, results); } } } }