package com.revolsys.geometry.graph.visitor;
import java.util.List;
import java.util.function.Consumer;
import com.revolsys.geometry.graph.Edge;
import com.revolsys.geometry.graph.Graph;
import com.revolsys.geometry.index.IdObjectIndex;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.LineString;
import com.revolsys.visitor.CreateListVisitor;
import com.revolsys.visitor.DelegatingVisitor;
public class BoundingBoxIntersectsEdgeVisitor<T> extends DelegatingVisitor<Edge<T>> {
public static <T> List<Edge<T>> getEdges(final Graph<T> graph, final Edge<T> edge,
final double maxDistance) {
final CreateListVisitor<Edge<T>> results = new CreateListVisitor<>();
final LineString line = edge.getLine();
BoundingBox boundingBox = line.getBoundingBox();
boundingBox = boundingBox.expand(maxDistance);
final BoundingBoxIntersectsEdgeVisitor<T> visitor = new BoundingBoxIntersectsEdgeVisitor<>(
boundingBox, results);
final IdObjectIndex<Edge<T>> index = graph.getEdgeIndex();
index.forEach(boundingBox, visitor);
final List<Edge<T>> list = results.getList();
list.remove(edge);
return list;
}
private final BoundingBox boundingBox;
public BoundingBoxIntersectsEdgeVisitor(final BoundingBox boundingBox,
final Consumer<Edge<T>> matchVisitor) {
super(matchVisitor);
this.boundingBox = boundingBox;
}
@Override
public void accept(final Edge<T> edge) {
final com.revolsys.geometry.model.BoundingBox envelope = edge.getBoundingBox();
if (this.boundingBox.intersects(envelope)) {
super.accept(edge);
}
}
}