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.Dimension; import com.revolsys.geometry.model.IntersectionMatrix; import com.revolsys.geometry.model.LineString; import com.revolsys.visitor.CreateListVisitor; public class EdgeIntersectLineVisitor<T> implements Consumer<Edge<T>> { public static <T> List<Edge<T>> getEdges(final Graph<T> graph, final LineString line) { final CreateListVisitor<Edge<T>> results = new CreateListVisitor<>(); final BoundingBox env = line.getBoundingBox(); final IdObjectIndex<Edge<T>> index = graph.getEdgeIndex(); index.forEach(env, new EdgeIntersectLineVisitor<>(line, results)); return results.getList(); } private final LineString line; private final Consumer<Edge<T>> matchVisitor; public EdgeIntersectLineVisitor(final LineString line, final Consumer<Edge<T>> matchVisitor) { this.line = line; this.matchVisitor = matchVisitor; } @Override public void accept(final Edge<T> edge) { final LineString line = edge.getLine(); final IntersectionMatrix relate = this.line.relate(line); if (relate.get(0, 0) == Dimension.L) { this.matchVisitor.accept(edge); } } }