public QuadTreeItem <T>?QueryNearest(RectangleF range, PointF start) { var items = Query(range); if (items == null) { return(null); } bool hasValue = false; float lastItemDst = default; QuadTreeItem <T> lastItem = default; foreach (var item in items) { if (hasValue && item.Bounds.SquaredDistanceTo(start).CompareTo(lastItemDst) >= 0) { continue; } hasValue = true; lastItem = item; lastItemDst = item.Bounds.SquaredDistanceTo(start); } QuadTreePool <T> .Return(items); if (!hasValue) { return(null); } return(lastItem); }
public void Clear() { void RecursiveTreeReturn(QuadTree <T> tree, bool isRoot = false) { if (tree.IsDivided) { RecursiveTreeReturn(tree.TopLeft); RecursiveTreeReturn(tree.TopRight); RecursiveTreeReturn(tree.BottomLeft); RecursiveTreeReturn(tree.BottomRight); } tree.TopLeft = null; tree.TopRight = null; tree.BottomLeft = null; tree.BottomRight = null; tree.IsDivided = false; if (!isRoot) { QuadTreePool <T> .Return(tree); } } RecursiveTreeReturn(this, isRoot: true); Items.Clear(); }
public void Resize(RectangleF boundary) { Bounds = boundary; var items = GetItems(); Clear(); foreach (var item in items) { Insert(item); } QuadTreePool <T> .Return(items); }
private void Subdivide() { float x = Bounds.X; float y = Bounds.Y; float w = Bounds.Width / 2f; float h = Bounds.Height / 2f; // we cannot allow fuzzyBoundaries for leaf trees as that breaks precision TopLeft = QuadTreePool <T> .Rent(x, y, w, h, Threshold, AllowOverflow, fuzzyBoundaries : false); TopRight = QuadTreePool <T> .Rent(x + w, y, w, h, Threshold, AllowOverflow, fuzzyBoundaries : false); BottomLeft = QuadTreePool <T> .Rent(x, y + h, w, h, Threshold, AllowOverflow, fuzzyBoundaries : false); BottomRight = QuadTreePool <T> .Rent(x + w, y + h, w, h, Threshold, AllowOverflow, fuzzyBoundaries : false); IsDivided = true; }
/// <summary> /// Returns a list containing every item from this <see cref="QuadTree{T}"/>. /// </summary> /// <returns><see cref="ListArray{QuadTreeItem{T}}"/> containing every item.</returns> public ListArray <QuadTreeItem <T> > GetItems() { var items = QuadTreePool <T> .RentItemList(); void AddToList(QuadTree <T> tree) { items.AddRange(tree.Items); if (tree.IsDivided) { AddToList(tree.TopLeft); AddToList(tree.TopRight); AddToList(tree.BottomLeft); AddToList(tree.BottomRight); } } AddToList(this); return(items); }
public ListArray <QuadTreeItem <T> > Query(RectangleF range) { if (!Bounds.Intersects(range)) { return(null); } var result = QuadTreePool <T> .RentItemList(); var items = GetItems(); foreach (var item in items) { if (range.Intersects(item.Bounds)) { result.Add(item); } } QuadTreePool <T> .Return(items); return(result); }