package com.revolsys.geometry.model.vertex; import java.util.NoSuchElementException; import com.revolsys.geometry.model.LineString; public class LineStringVertex extends AbstractVertex { private static final long serialVersionUID = 1L; private int vertexIndex; public LineStringVertex(final LineString line, final int... vertexId) { super(line); setVertexId(vertexId); } public LineStringVertex(final LineString line, final int vertexIndex) { super(line); setVertexId(vertexIndex); } @Override public double getCoordinate(final int axisIndex) { final LineString line = getGeometry(); return line.getCoordinate(this.vertexIndex, axisIndex); } @Override public double getLineCoordinateRelative(final int vertexOffset, final int axisIndex) { if (isEmpty()) { return java.lang.Double.NaN; } else { final int vertexIndex = getVertexIndex(); final LineString line = getLineString(); return line.getCoordinate(vertexIndex + vertexOffset, axisIndex); } } @Override public Vertex getLineNext() { final int newVertexIndex = this.vertexIndex + 1; final LineString lineString = getLineString(); final int vertexCount = lineString.getVertexCount(); if (newVertexIndex < vertexCount) { return new LineStringVertex(lineString, newVertexIndex); } else { return null; } } @Override public Vertex getLinePrevious() { final int newVertexIndex = this.vertexIndex - 1; if (newVertexIndex < 0) { return null; } else { return new LineStringVertex(getLineString(), newVertexIndex); } } public LineString getLineString() { return (LineString)getGeometry(); } @Override public int[] getVertexId() { return new int[] { this.vertexIndex }; } @Override public int getVertexIndex() { return this.vertexIndex; } @Override public double getX() { final LineString line = getGeometry(); return line.getCoordinate(this.vertexIndex, 0); } @Override public double getY() { final LineString line = getGeometry(); return line.getCoordinate(this.vertexIndex, 1); } @Override public boolean hasNext() { final LineString lineString = getLineString(); if (lineString.isEmpty()) { return false; } else { if (this.vertexIndex + 1 < lineString.getVertexCount()) { return true; } else { return false; } } } @Override public boolean isFrom() { return getVertexIndex() == 0; } @Override public boolean isTo() { final int vertexIndex = getVertexIndex(); final LineString lineString = getLineString(); final int lastVertexIndex = lineString.getVertexCount() - 1; return vertexIndex == lastVertexIndex; } @Override public Vertex next() { final LineString lineString = getLineString(); this.vertexIndex++; if (this.vertexIndex < lineString.getVertexCount()) { return this; } else { throw new NoSuchElementException(); } } @Override public void remove() { throw new UnsupportedOperationException("Removing vertices not supported"); } public void setVertexId(final int... vertexId) { this.vertexIndex = vertexId[0]; } public void setVertexIndex(final int vertexIndex) { this.vertexIndex = vertexIndex; } }