/*
* 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 com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.CoordinateSequenceFactory;
/**
* An efficient ordinate accumulator used by some geometry manipulation class in this package
* @author Andrea Aime - OpenGeo
*/
class Ordinates {
/**
* The current coordinate
*/
int curr;
/**
* The ordinates holder
*/
double[] ordinates;
public Ordinates() {
ordinates = new double[10];
curr = -1;
}
public Ordinates(int capacity) {
ordinates = new double[capacity];
curr = -1;
}
/**
* Converts the ordinate into a coordinate sequence
*/
public CoordinateSequence toCoordinateSequence(CoordinateSequenceFactory csfac) {
CoordinateSequence cs = csfac.create(size(), 2);
for (int i = 0; i <= curr; i++) {
cs.setOrdinate(i, 0, ordinates[i * 2]);
cs.setOrdinate(i, 1, ordinates[i * 2 + 1]);
}
return cs;
}
/**
* The number of coordinates
* @return
*/
int size() {
return curr + 1;
}
/**
* Adds a coordinate to this list
* @param x
* @param y
*/
void add(double x, double y) {
curr++;
if((curr * 2 + 1) >= ordinates.length) {
int newSize = ordinates.length * 3 / 2;
if(newSize < 10) {
newSize = 10;
}
double[] resized = new double[newSize];
System.arraycopy(ordinates, 0, resized, 0, ordinates.length);
ordinates = resized;
}
ordinates[curr * 2] = x;
ordinates[curr * 2 + 1] = y;
}
/**
* Resets the ordinates
*/
void clear() {
curr = -1;
}
double getOrdinate(int coordinate, int ordinate) {
return ordinates[coordinate * 2 + ordinate];
}
public void init(CoordinateSequence cs) {
clear();
for(int i = 0; i < cs.size(); i++) {
add(cs.getOrdinate(i, 0), cs.getOrdinate(i, 1));
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("Ordinates[");
for (int i = 0; i <= curr; i++) {
sb.append(ordinates[i * 2]);
sb.append(" ");
sb.append(ordinates[i * 2 + 1]);
if(i < curr) {
sb.append(";");
}
}
sb.append("]");
return sb.toString();
}
}