use of com.revolsys.geometry.model.segment.LineSegment in project com.revolsys.open by revolsys.
the class LineStringGraph method intersects.
public boolean intersects(final LineString line) {
BoundingBox envelope = line.getBoundingBox();
final double scaleXY = this.geometryFactory.getScaleXY();
double maxDistance = 0;
if (scaleXY > 0) {
maxDistance = 1 / scaleXY;
}
envelope = envelope.expand(maxDistance);
if (envelope.intersects(this.envelope)) {
final LineString points = line;
final int numPoints = points.getVertexCount();
final Point fromPoint = points.getPoint(0);
final Point toPoint = points.getPoint(numPoints - 1);
Point previousPoint = fromPoint;
for (int i = 1; i < numPoints; i++) {
final Point nextPoint = points.getPoint(i);
final LineSegment line1 = new LineSegmentDoubleGF(previousPoint, nextPoint);
final List<Edge<LineSegment>> edges = EdgeLessThanDistance.getEdges(this, line1, maxDistance);
for (final Edge<LineSegment> edge2 : edges) {
final LineSegment line2 = edge2.getObject();
final Geometry intersections = line1.getIntersection(line2);
for (final Point intersection : intersections.vertices()) {
if (intersection.equals(fromPoint) || intersection.equals(toPoint)) {
// Point intersection, make sure it's not at the start
final Node<LineSegment> node = findNode(intersection);
final int degree = node.getDegree();
if (node.equals(2, this.fromPoint)) {
if (degree > 2) {
// into account loops
return true;
}
} else if (degree > 1) {
// Intersection not at the start/end of the other line
return true;
}
} else {
// Intersection not at the start/end of the line
return true;
}
}
for (final Point point : line1.vertices()) {
if (line2.distancePoint(point) < maxDistance) {
if (point.equals(fromPoint) || point.equals(toPoint)) {
// Point intersection, make sure it's not at the start
final double maxDistance1 = maxDistance;
for (final Node<LineSegment> node : this.getNodes(point, maxDistance1)) {
final int degree = node.getDegree();
if (node.equals(2, this.fromPoint)) {
if (degree > 2) {
// into account loops
return true;
}
} else if (degree > 1) {
// Intersection not at the start/end of the other line
return true;
}
}
} else {
// Intersection not at the start/end of the line
return true;
}
}
}
}
previousPoint = nextPoint;
}
}
return false;
}
use of com.revolsys.geometry.model.segment.LineSegment in project com.revolsys.open by revolsys.
the class LineSegmentIndex method insert.
public void insert(final Lineal line) {
for (final LineSegment lineSegment : line.segments()) {
final LineSegment clone = (LineSegment) lineSegment.clone();
insert(clone);
}
}
use of com.revolsys.geometry.model.segment.LineSegment in project com.revolsys.open by revolsys.
the class SegmentPointComparatorFullTest method checkSegment.
private void checkSegment(final double x, final double y) {
final Point seg0 = new PointDoubleXY(0, 0);
final Point seg1 = new PointDoubleXY(x, y);
final LineSegment seg = new LineSegmentDouble(seg0, seg1);
for (int i = 0; i < 4; i++) {
final double dist = i;
final double gridSize = 1;
checkPointsAtDistance(seg, dist, dist + 1.0 * gridSize);
checkPointsAtDistance(seg, dist, dist + 2.0 * gridSize);
checkPointsAtDistance(seg, dist, dist + 3.0 * gridSize);
checkPointsAtDistance(seg, dist, dist + 4.0 * gridSize);
}
}
use of com.revolsys.geometry.model.segment.LineSegment in project com.revolsys.open by revolsys.
the class LineSegmentTest method assertLinearIntersection.
public void assertLinearIntersection(final double l1x1, final double l1y1, final double l1x2, final double l1y2, final double l2x1, final double l2y1, final double l2x2, final double l2y2, final double lx1, final double ly1, final double lx2, final double ly2) {
final LineSegment line1 = new LineSegmentDoubleGF(GEOMETRY_FACTORY_2D, 2, l1x1, l1y1, l1x2, l1y2);
final LineSegment line2 = new LineSegmentDoubleGF(GEOMETRY_FACTORY_2D, 2, l2x1, l2y1, l2x2, l2y2);
final LineSegment line = new LineSegmentDoubleGF(GEOMETRY_FACTORY_2D, 2, lx1, ly1, lx2, ly2);
final Geometry intersection = line1.getIntersection(line2);
TestUtil.equalsExact(2, intersection, line);
}
use of com.revolsys.geometry.model.segment.LineSegment in project com.revolsys.open by revolsys.
the class SierpinskiCarpetBuilder method getGeometry.
@Override
public Geometry getGeometry() {
final int level = recursionLevelForSize(this.numPts);
final LineSegment baseLine = getSquareBaseLine();
final Point origin = baseLine.getPoint(0);
final List<LinearRing> rings = new ArrayList<>();
final LinearRing shell = ((Polygon) getSquareExtent().toGeometry()).getShell();
rings.add(shell);
addHoles(level, origin.getX(), origin.getY(), getDiameter(), rings);
return this.geometryFactory.polygon(shell);
}
Aggregations