}
public static LineSegment addLength(final LineSegment line,
final double startDistance, final double endDistance) {
double angle = line.angle();
Coordinate c1 = offset(line.p0, angle, -startDistance);
Coordinate c2 = offset(line.p1, angle, endDistance);
return new LineSegment(c1, c2);
}
/**
* Add a evelation (z) value for a coordinate that is on a line segment.
*
* @param coordinate The Coordinate.
* @param line The line segment the coordinate is on.
*/
public static void addElevation(final Coordinate coordinate,
final LineSegment line) {
double z = getElevation(line, coordinate);
coordinate.z = z;
}
public static double getElevation(final LineSegment line,
final Coordinate coordinate) {
Coordinate c0 = line.p0;
Coordinate c1 = line.p1;
double fraction = coordinate.distance(c0) / line.getLength();
double z = c0.z + (c1.z - c0.z) * (fraction);
return z;
}
public static CoordinateSequence subSequence(final CoordinateSequence coords,
final int start, final int length) {
int dimension = coords.getDimension();
PackedCoordinateSequenceFactory factory = PackedCoordinateSequenceFactory.DOUBLE_FACTORY;
CoordinateSequence newCoords = factory.create(length, dimension);
copyCoords(coords, start, newCoords, 0, length);
return newCoords;
}
public static void visitLineSegments(final CoordinateSequence coords,
final LineSegmentVistor visitor) {
Coordinate previousCoordinate = coords.getCoordinate(0);
for (int i = 1; i < coords.size(); i++) {
Coordinate coordinate = coords.getCoordinate(i);
LineSegment segment = new LineSegment(previousCoordinate, coordinate);
if (segment.getLength() > 0) {
if (!visitor.visit(segment)) {
return;
}
}
previousCoordinate = coordinate;
}
}
public static void addElevation(final PrecisionModel precisionModel,
final Coordinate coordinate, final LineSegment3D line) {
addElevation(coordinate, line);
coordinate.z = precisionModel.makePrecise(coordinate.z);
}
public static void makePrecise(final PrecisionModel precision,
final Geometry geometry) {
geometry.apply(new CoordinateSequenceFilter() {
public void filter(final CoordinateSequence coordinates, final int index) {
for (int i = 0; i < coordinates.getDimension(); i++) {
double ordinate = coordinates.getOrdinate(index, i);
double preciseOrdinate = precision.makePrecise(ordinate);
coordinates.setOrdinate(index, i, preciseOrdinate);
}
}
public boolean isDone() {
return false;
}
public boolean isGeometryChanged() {
return true;
}
});
}
public static Envelope buffer(final Envelope envelope, final int i) {
// TODO Auto-generated method stub
return new Envelope(envelope.getMinX() - i, envelope.getMaxX() + i,
envelope.getMinY() - i, envelope.getMaxY() + i);
}
/**
* Computes whether a ring defined by an array of {@link Coordinate} is
* oriented counter-clockwise.
*
- The list of points is assumed to have the first and last points equal.
* - This will handle coordinate lists which contain repeated points.
*
*
* This algorithm is only guaranteed to work with valid rings. If the
* ring is invalid (e.g. self-crosses or touches), the computed result may
* not be correct.
*
* @param ring an array of coordinates forming a ring
* @return
true if the ring i