package com.revolsys.geometry.test.old.geom;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.LineString;
import com.revolsys.geometry.model.Point;
import com.revolsys.geometry.model.PointList;
import com.revolsys.geometry.model.impl.PointDoubleXY;
/**
* Densifies a LineString
*
* @version 1.7
*/
public class SegmentDensifier {
private final LineString inputLine;
private PointList newCoords;
public SegmentDensifier(final LineString line) {
this.inputLine = line;
}
public Geometry densify(final double segLength) {
this.newCoords = new PointList();
final LineString seq = this.inputLine;
this.newCoords.add(seq.getPoint(0));
for (int i = 0; i < seq.getVertexCount() - 1; i++) {
final Point p0 = seq.getPoint(i);
final Point p1 = seq.getPoint(i + 1);
densify(p0, p1, segLength);
}
final Point[] newPts = this.newCoords.toPointArray();
return this.inputLine.getGeometryFactory().lineString(newPts);
}
private void densify(final Point p0, final Point p1, final double segLength) {
final double origLen = p1.distancePoint(p0);
final int nPtsToAdd = (int)Math.floor(origLen / segLength);
final double delx = p1.getX() - p0.getX();
final double dely = p1.getY() - p0.getY();
final double segLenFrac = segLength / origLen;
for (int i = 0; i <= nPtsToAdd; i++) {
final double addedPtFrac = i * segLenFrac;
final Point pt = new PointDoubleXY(p0.getX() + addedPtFrac * delx,
p0.getY() + addedPtFrac * dely);
this.newCoords.add(pt, false);
}
this.newCoords.add(new PointDoubleXY(p1), false);
}
}