/// <summary> /// /// </summary> /// <param name="searchEnv"></param> /// <param name="visitor"></param> private void VisitItems(Envelope searchEnv, IItemVisitor <T> visitor) { // would be nice to filter items based on search envelope, but can't until they contain an envelope for (IEnumerator <T> i = _items.GetEnumerator(); i.MoveNext();) { visitor.VisitItem(i.Current); } }
public override void Query(double queryMin, double queryMax, IItemVisitor <T> visitor) { if (!Intersects(queryMin, queryMax)) { return; } visitor.VisitItem(_item); }
/// <inheritdoc cref="ISpatialIndex{T}.Query(Envelope, IItemVisitor{T})"/> public void Query(Envelope searchBounds, IItemVisitor <T> visitor) { // if the tree has not been built, do it now. if (_pos != _boxes.Length) { Build(); } int nodeIndex = _boxes.Length - 1; int level = _levelBounds.Length - 1; // stack for traversing nodes var stack = new Stack <int>(); bool done = false; while (!done) { // find the end index of the node int end = Math.Min(nodeIndex + _nodeSize, UpperBound(nodeIndex, _levelBounds)); // search through child nodes for (int pos = nodeIndex; pos < end; pos++) { int index = _indices[pos]; // check if node bbox intersects with query bbox if (!searchBounds.Intersects(_boxes[pos])) { continue; } if (nodeIndex < _numItems) { visitor.VisitItem(_items[index]); } else { // push node index and level for further traversal stack.Push(index); stack.Push(level - 1); } } if (stack.Count > 1) { level = stack.Pop(); nodeIndex = stack.Pop(); } else { done = true; } } }
/// <summary> /// /// </summary> /// <param name="searchEnv"></param> /// <param name="visitor"></param> protected virtual void VisitItems(Rectangle searchEnv, IItemVisitor <TItem> visitor) { // would be nice to filter items based on search envelope, but can't until they contain an envelope // lytico: what about having IItemVisitor.GetEnvelope(TItem item) if (HasItems) { foreach (var current in Items) { visitor.VisitItem(current); } } }
private void Query(T searchBounds, AbstractNode <T, TItem> node, IItemVisitor <TItem> visitor) { foreach (var childBoundable in node.ChildBoundables) { if (!IntersectsOp.Intersects(childBoundable.Bounds, searchBounds)) { continue; } if (childBoundable is AbstractNode <T, TItem> ) { Query(searchBounds, (AbstractNode <T, TItem>)childBoundable, visitor); } else if (childBoundable is ItemBoundable <T, TItem> ) { visitor.VisitItem(((ItemBoundable <T, TItem>)childBoundable).Item); } else { Assert.ShouldNeverReachHere(); } } }
/// <summary> /// /// </summary> /// <param name="searchBounds"></param> /// <param name="node"></param> /// <param name="visitor"></param> private void Query(object searchBounds, AbstractNode node, IItemVisitor visitor) { foreach (object obj in node.ChildBoundables) { IBoundable childBoundable = (IBoundable)obj; if (!IntersectsOp.Intersects(childBoundable.Bounds, searchBounds)) { continue; } if (childBoundable is AbstractNode) { Query(searchBounds, (AbstractNode)childBoundable, visitor); } else if (childBoundable is ItemBoundable) { visitor.VisitItem(((ItemBoundable)childBoundable).Item); } else { Assert.ShouldNeverReachHere(); } } }
/// <summary> /// /// </summary> /// <param name="searchEnv"></param> /// <param name="visitor"></param> private void VisitItems(IEnvelope searchEnv, IItemVisitor visitor) { // would be nice to filter items based on search envelope, but can't until they contain an envelope for (IEnumerator i = _items.GetEnumerator(); i.MoveNext(); ) visitor.VisitItem(i.Current); }
private void Query(object searchBounds, AbstractNode node, IItemVisitor visitor) { foreach (var obj in node.ChildBoundables) { var childBoundable = (IBoundable)obj; if (!IntersectsOp.Intersects(childBoundable.Bounds, searchBounds)) continue; if (childBoundable is AbstractNode) Query(searchBounds, (AbstractNode)childBoundable, visitor); else if (childBoundable is ItemBoundable) visitor.VisitItem(((ItemBoundable)childBoundable).Item); else Assert.ShouldNeverReachHere(); } }