private void Contains(Rectangle r, IntProc v)
        {
            _parents.Clear();
            _parents.Push(_rootNodeId);
            _countSum++;

            _parentsEntry.Clear();
            _parentsEntry.Push(-1);

            while (_parents.Count > 0)
            {
                var n          = GetNode(_parents.Peek());
                var startIndex = _parentsEntry.Peek() + 1;
                _countSum++;
                if (!n.IsLeaf())
                {
                    var intersects = false;
                    for (var i = startIndex; i < n.EntryCount; i++)
                    {
                        if (r.IntersectsWith(n.Entries[i]))
                        {
                            _parents.Push(n.Ids[i]);
                            _countSum++;
                            _parentsEntry.Pop();
                            _parentsEntry.Push(i);
                            _parentsEntry.Push(-1);
                            intersects = true;
                            break;
                        }
                    }

                    if (intersects)
                    {
                        continue;
                    }
                }
                else
                {
                    for (var i = 0; i < n.EntryCount; i++)
                    {
                        if (r.Contains(n.Entries[i]))
                        {
                            v(n.Ids[i]);
                        }
                    }
                }

                _parents.Pop();
                _parentsEntry.Pop();
            }
        }
 private void Intersects(Rectangle r, IntProc v, Node n)
 {
     for (var i = 0; i < n.EntryCount; i++)
     {
         if (r.IntersectsWith(n.Entries[i]))
         {
             if (n.IsLeaf())
             {
                 v(n.Ids[i]);
             }
             else
             {
                 var childNode = GetNode(n.Ids[i]);
                 Intersects(r, v, childNode);
             }
         }
     }
 }