package com.revolsys.geometry.index;
import java.util.ArrayList;
import java.util.List;
import com.revolsys.geometry.index.quadtree.QuadTree;
import com.revolsys.geometry.index.visitor.LineSegmentIntersectionVisitor;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.LineString;
import com.revolsys.geometry.model.Lineal;
import com.revolsys.geometry.model.Point;
import com.revolsys.geometry.model.segment.LineSegment;
import com.revolsys.geometry.model.segment.LineSegmentDoubleGF;
public class LineSegmentIndex extends QuadTree<LineSegment> {
private static final long serialVersionUID = 1L;
public LineSegmentIndex(final Geometry geometry) {
super(geometry.getGeometryFactory());
insert(geometry);
}
public LineSegmentIndex(final Lineal line) {
super(line.getGeometryFactory());
insert(line);
}
public void insert(final Geometry geometry) {
for (int i = 0; i < geometry.getGeometryCount(); i++) {
final Geometry subGeometry = geometry.getGeometry(i);
if (subGeometry instanceof LineString) {
final LineString line = (LineString)subGeometry;
insert(line);
}
}
}
public void insert(final Lineal line) {
for (final LineSegment lineSegment : line.segments()) {
final LineSegment clone = (LineSegment)lineSegment.clone();
insert(clone);
}
}
public void insert(final LineSegment lineSegment) {
final BoundingBox envelope = lineSegment.getBoundingBox();
insertItem(envelope, lineSegment);
}
public boolean isWithinDistance(final Point point) {
BoundingBox envelope = point.getBoundingBox();
envelope = envelope.expand(1);
final List<LineSegment> lines = getItems(envelope);
for (final LineSegment line : lines) {
if (line.distancePoint(point) <= 1) {
return true;
}
}
return false;
}
public List<Geometry> queryIntersections(final LineSegment querySeg) {
final BoundingBox env = querySeg.getBoundingBox();
final LineSegmentIntersectionVisitor visitor = new LineSegmentIntersectionVisitor(querySeg);
forEach(env, visitor);
final List<Geometry> intersections = new ArrayList<>(visitor.getIntersections());
return intersections;
}
public List<Geometry> queryIntersections(final Point c0, final Point c1) {
return queryIntersections(new LineSegmentDoubleGF(c0, c1));
}
}