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);
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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);
        }