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); } } } }