コード例 #1
0
        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);
        }
コード例 #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();
        }
コード例 #3
0
        public void Resize(RectangleF boundary)
        {
            Bounds = boundary;
            var items = GetItems();

            Clear();

            foreach (var item in items)
            {
                Insert(item);
            }

            QuadTreePool <T> .Return(items);
        }
コード例 #4
0
        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;
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        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);
        }