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.graph.Node; import com.revolsys.geometry.model.BoundingBox; import com.revolsys.geometry.model.Point; import com.revolsys.visitor.CreateListVisitor; import com.revolsys.visitor.DelegatingVisitor; public class EdgeLessThanDistanceToNodeVisitor<T> extends DelegatingVisitor<Edge<T>> { public static <T> List<Edge<T>> edgesWithinDistance(final Graph<T> graph, final Node<T> node, final double maxDistance) { final CreateListVisitor<Edge<T>> results = new CreateListVisitor<>(); final Point point = node; BoundingBox env = point.getBoundingBox(); env = env.expand(maxDistance); graph.getEdgeIndex().forEach(env, new EdgeLessThanDistanceToNodeVisitor<>(node, maxDistance, results)); return results.getList(); } private BoundingBox envelope; private final double maxDistance; private final Node<T> node; public EdgeLessThanDistanceToNodeVisitor(final Node<T> node, final double maxDistance, final Consumer<Edge<T>> matchVisitor) { super(matchVisitor); this.node = node; this.maxDistance = maxDistance; final Point point = node; this.envelope = point.getBoundingBox(); this.envelope = this.envelope.expand(maxDistance); } @Override public void accept(final Edge<T> edge) { final com.revolsys.geometry.model.BoundingBox envelope = edge.getBoundingBox(); if (this.envelope.distance(envelope) < this.maxDistance) { if (!edge.hasNode(this.node)) { if (edge.isLessThanDistance(this.node, this.maxDistance)) { super.accept(edge); } } } } }