Beispiel #1
0
        public IEnumerable <RTreeNode <T> > Search(Envelope envelope)
        {
            var node = root;

            if (envelope == null || node.Envelope == null)
            {
                return(Enumerable.Empty <RTreeNode <T> >());
            }

            if (!envelope.Intersects(node.Envelope))
            {
                return(Enumerable.Empty <RTreeNode <T> >());
            }

            var retval        = new List <RTreeNode <T> >();
            var nodesToSearch = new Stack <RTreeNode <T> >();

            while (node != null)
            {
                for (var i = 0; i < node.Children.Count; i++)
                {
                    var child         = node.Children[i];
                    var childEnvelope = child.Envelope;

                    if (envelope.Intersects(childEnvelope))
                    {
                        if (node.IsLeaf)
                        {
                            retval.Add(child);
                        }
                        else if (envelope.Contains(childEnvelope))
                        {
                            Collect(child, retval);
                        }
                        else
                        {
                            nodesToSearch.Push(child);
                        }
                    }
                }

                node = nodesToSearch.TryPop();
            }

            return(retval);
        }