package com.revolsys.geometry.model.segment;
import java.util.NoSuchElementException;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.LineString;
import com.revolsys.geometry.model.impl.AbstractLineString;
import com.revolsys.geometry.model.vertex.Vertex;
public class LineStringSegment extends AbstractLineString implements Segment {
private static final long serialVersionUID = 1L;
private int segmentIndex;
protected final LineString lineString;
public LineStringSegment(final LineString line, final int segmentIndex) {
this.lineString = line;
this.segmentIndex = segmentIndex;
}
@Override
public LineStringSegment clone() {
return (LineStringSegment)super.clone();
}
@Override
public int getAxisCount() {
return this.lineString.getAxisCount();
}
@Override
public double getCoordinate(final int vertexIndex, final int axisIndex) {
if (vertexIndex < 0 || vertexIndex > 1) {
return Double.NaN;
} else {
return this.lineString.getCoordinate(this.segmentIndex + vertexIndex, axisIndex);
}
}
@Override
public double[] getCoordinates() {
final int axisCount = getAxisCount();
final double[] coordinates = new double[axisCount * 2];
for (int vertexIndex = 0; vertexIndex < 2; vertexIndex++) {
for (int axisIndex = 0; axisIndex < axisCount; axisIndex++) {
coordinates[vertexIndex * axisCount + axisIndex] = getCoordinate(vertexIndex, axisIndex);
}
}
return coordinates;
}
@SuppressWarnings("unchecked")
@Override
public <V extends Geometry> V getGeometry() {
return (V)this.lineString;
}
@Override
public GeometryFactory getGeometryFactory() {
return this.lineString.getGeometryFactory();
}
@Override
public Vertex getGeometryVertex(final int index) {
if (index == 0) {
return this.lineString.getVertex(this.segmentIndex);
} else if (index == 1) {
return this.lineString.getVertex(this.segmentIndex + 1);
} else {
return null;
}
}
public LineString getLineString() {
return this.lineString;
}
@Override
public int[] getSegmentId() {
return new int[] {
this.segmentIndex
};
}
@Override
public int getSegmentIndex() {
return this.segmentIndex;
}
@Override
public double getX(final int vertexIndex, final int axisIndex) {
if (vertexIndex < 0 || vertexIndex > 1) {
return Double.NaN;
} else {
return this.lineString.getX(this.segmentIndex + vertexIndex, axisIndex);
}
}
@Override
public double getY(final int vertexIndex) {
if (vertexIndex < 0 || vertexIndex > 1) {
return Double.NaN;
} else {
return this.lineString.getY(this.segmentIndex + vertexIndex);
}
}
@Override
public double getZ(final int vertexIndex) {
if (vertexIndex < 0 || vertexIndex > 1) {
return Double.NaN;
} else {
return this.lineString.getZ(this.segmentIndex + vertexIndex);
}
}
@Override
public boolean hasNext() {
final int segmentIndex = this.segmentIndex;
if (segmentIndex + 1 < this.lineString.getSegmentCount()) {
return true;
} else {
return false;
}
}
@Override
public boolean isLineClosed() {
return this.lineString.isClosed();
}
@Override
public boolean isLineEnd() {
return this.segmentIndex == this.lineString.getSegmentCount() - 1;
}
@Override
public boolean isLineStart() {
return this.segmentIndex == 0;
}
@Override
public Segment next() {
this.segmentIndex++;
if (this.segmentIndex < this.lineString.getSegmentCount()) {
return this;
} else {
throw new NoSuchElementException();
}
}
@Override
public void remove() {
throw new UnsupportedOperationException("Removing segments not supported");
}
@Override
public void setSegmentId(final int... segmentId) {
this.segmentIndex = segmentId[0];
}
public void setSegmentIndex(final int segmentIndex) {
this.segmentIndex = segmentIndex;
}
}