/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2004-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.geometry.jts;
import java.awt.geom.AffineTransform;
import java.awt.geom.PathIterator;
import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.LineString;
/**
* A path iterator for the LiteShape class, specialized to iterate over
* LineString object.
*
* @author Andrea Aime
* @author simone giannecchini
* @source $URL$
* @version $Id$
*/
public final class LineIterator2 implements PathIterator {
private double[] allCoords;
/** Transform applied on the coordinates during iteration */
private AffineTransform at;
/** Current line coordinate */
private int currentCoord = 0;
private int actualCoords; // numb coordinates
/** True when the iteration is terminated */
private boolean done = false;
public LineIterator2()
{
}
/**
* @see java.awt.geom.PathIterator#currentSegment(float[])
*/
public int currentSegment(float[] coords)
{
if (currentCoord == 0)
{
coords[0] = (float)allCoords[0];
coords[1] = (float)allCoords[1];
if (at !=null)
at.transform(coords, 0, coords, 0, 1);
return SEG_MOVETO;
}
else
{
coords[0] = (float)allCoords[currentCoord*2];
coords[1] = (float)allCoords[currentCoord*2+1];
if (at !=null)
at.transform(coords, 0, coords, 0, 1);
return SEG_LINETO;
}
}
/**
* @param ls
* @param at
*
*/
public void init(LineString ls, AffineTransform at)
{
if ( (at==null ) || (at.isIdentity()) )
{
this.at = null;
}
else
{
this.at =at;
}
CoordinateSequence coordinates = ls.getCoordinateSequence();
if (coordinates instanceof LiteCoordinateSequence)
{
//array already there for us
allCoords = ( (LiteCoordinateSequence) coordinates).getXYArray();
actualCoords = coordinates.size();
}
else
{
//build the array
actualCoords = coordinates.size();
allCoords = new double[actualCoords*2];
for (int t=0;t<actualCoords;t++)
{
allCoords[t*2]= coordinates.getOrdinate(t,0);
allCoords[t*2+1]= coordinates.getOrdinate(t,1);
}
}
done =false;
currentCoord=0;
}
/**
* Returns the winding rule for determining the interior of the path.
*
* @return the winding rule.
*
* @see #WIND_EVEN_ODD
* @see #WIND_NON_ZERO
*/
public int getWindingRule() {
return WIND_NON_ZERO;
}
/**
* Tests if the iteration is complete.
*
* @return <code>true</code> if all the segments have been read;
* <code>false</code> otherwise.
*/
public boolean isDone() {
return done;
}
/**
* Moves the iterator to the next segment of the path forwards along the
* primary direction of traversal as long as there are more points in that
* direction.
*/
public void next() {
if ( currentCoord == (actualCoords-1))
{
done = true;
}
else
{
currentCoord++;
}
}
/**
* @see java.awt.geom.PathIterator#currentSegment(double[])
*/
public int currentSegment(double[] coords) {
float[] fco = new float[6];
int result = currentSegment(fco);
coords[0] =fco[0]; coords[1] =fco[1];
coords[2] =fco[2]; coords[3] =fco[3];
return result;
}
}