예제 #1
0
파일: QuadTree.cs 프로젝트: clapis/roamler
        public bool Insert(T point)
        {
            if (!_bounds.Contains(point))
            {
                return(false);
            }

            if (_points.Count < MaxSize)
            {
                _points.Add(point);
                return(true);
            }

            if (!this.HasChildren)
            {
                Split();
            }

            if (_northWest.Insert(point))
            {
                return(true);
            }
            if (_northEast.Insert(point))
            {
                return(true);
            }
            if (_southWest.Insert(point))
            {
                return(true);
            }
            if (_southEast.Insert(point))
            {
                return(true);
            }

            // shouldn't happen
            return(false);
        }
예제 #2
0
파일: QuadTree.cs 프로젝트: clapis/roamler
        public List <T> Search(Boundary searchArea)
        {
            List <T> points = new List <T>();

            if (!_bounds.Intersects(searchArea))
            {
                return(points);
            }

            var pointsWithinSearchArea = _points.Where(p => searchArea.Contains(p));

            points.AddRange(pointsWithinSearchArea);

            if (this.HasChildren)
            {
                points.AddRange(_northWest.Search(searchArea));
                points.AddRange(_northEast.Search(searchArea));
                points.AddRange(_southWest.Search(searchArea));
                points.AddRange(_southEast.Search(searchArea));
            }

            return(points);
        }