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