package com.revolsys.geometry.graph.visitor;
import java.util.Collections;
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 EdgeIntersectsLinearlyEdgeVisitor<T> implements Consumer<Edge<T>> {
public static <T> List<Edge<T>> getEdges(final Graph<T> graph, final Edge<T> edge) {
final CreateListVisitor<Edge<T>> results = new CreateListVisitor<>();
final LineString line = edge.getLine();
final BoundingBox env = line.getBoundingBox();
final IdObjectIndex<Edge<T>> index = graph.getEdgeIndex();
index.forEach(env, new EdgeIntersectsLinearlyEdgeVisitor<>(edge, results));
final List<Edge<T>> edges = results.getList();
Collections.sort(edges);
return edges;
}
private final Edge<T> edge;
private final Consumer<Edge<T>> matchVisitor;
public EdgeIntersectsLinearlyEdgeVisitor(final Edge<T> edge,
final Consumer<Edge<T>> matchVisitor) {
this.edge = edge;
this.matchVisitor = matchVisitor;
}
@Override
public void accept(final Edge<T> edge2) {
if (edge2 != this.edge) {
final LineString line1 = this.edge.getLine();
final LineString line2 = edge2.getLine();
final BoundingBox envelope1 = line1.getBoundingBox();
final BoundingBox envelope2 = line2.getBoundingBox();
if (envelope1.intersects(envelope2)) {
final IntersectionMatrix relate = line1.relate(line2);
if (relate.get(0, 0) == Dimension.L) {
this.matchVisitor.accept(edge2);
}
}
}
}
}