package com.revolsys.geometry.graph.linestring; import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; 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.Point; import com.revolsys.geometry.model.segment.LineSegment; import com.revolsys.geometry.model.segment.LineSegmentDoubleGF; import com.revolsys.visitor.CreateListVisitor; import com.revolsys.visitor.DelegatingVisitor; public class EdgeLessThanDistance extends DelegatingVisitor<Edge<LineSegment>> implements Predicate<Edge<LineSegment>> { public static List<Edge<LineSegment>> getEdges(final Graph<LineSegment> graph, final LineSegment lineSegment, final double maxDistance) { final CreateListVisitor<Edge<LineSegment>> results = new CreateListVisitor<>(); BoundingBox envelope = lineSegment.getBoundingBox(); envelope = envelope.expand(maxDistance); final IdObjectIndex<Edge<LineSegment>> edgeIndex = graph.getEdgeIndex(); edgeIndex.forEach(envelope, new EdgeLessThanDistance(lineSegment, maxDistance, results)); return results.getList(); } public static List<Edge<LineSegment>> getEdges(final LineStringGraph graph, final Point fromPoint, final Point toPoint, final double maxDistance) { final LineSegment lineSegment = new LineSegmentDoubleGF(fromPoint, toPoint); return getEdges(graph, lineSegment, maxDistance); } private final LineSegment lineSegment; private final double maxDistance; public EdgeLessThanDistance(final LineSegment lineSegment, final double maxDistance) { this.lineSegment = lineSegment; this.maxDistance = maxDistance; } public EdgeLessThanDistance(final LineSegment lineSegment, final double maxDistance, final Consumer<Edge<LineSegment>> matchVisitor) { super(matchVisitor); this.lineSegment = lineSegment; this.maxDistance = maxDistance; } @Override public void accept(final Edge<LineSegment> edge) { if (test(edge)) { super.accept(edge); } } @Override public boolean test(final Edge<LineSegment> edge) { final LineSegment lineSegment = edge.getObject(); final double distance = lineSegment.distance(this.lineSegment); if (distance <= this.maxDistance) { return true; } else { return false; } } }