/* This program 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, either version 3 of
the License, or (at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
package org.opentripplanner.common.geometry;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.opentripplanner.common.model.P2;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.CoordinateSequence;
import com.vividsolutions.jts.geom.CoordinateSequenceFactory;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
public class GeometryUtilsTest {
@Test
public final void testSplitGeometryAtFraction() {
Coordinate[] coordinates = new Coordinate[4];
coordinates[0] = new Coordinate(0, 0);
coordinates[1] = new Coordinate(0, 1);
coordinates[2] = new Coordinate(2, 1);
coordinates[3] = new Coordinate(2, 2);
Coordinate[][][] referenceCoordinates = new Coordinate[9][2][];
referenceCoordinates[0][1] = coordinates;
referenceCoordinates[1][0] = new Coordinate[2];
referenceCoordinates[1][0][0] = coordinates[0];
referenceCoordinates[1][0][1] = new Coordinate(0, 0.5);
referenceCoordinates[1][1] = new Coordinate[4];
referenceCoordinates[1][1][0] = referenceCoordinates[1][0][1];
referenceCoordinates[1][1][1] = coordinates[1];
referenceCoordinates[1][1][2] = coordinates[2];
referenceCoordinates[1][1][3] = coordinates[3];
referenceCoordinates[2][0] = new Coordinate[2];
referenceCoordinates[2][0][0] = coordinates[0];
referenceCoordinates[2][0][1] = coordinates[1];
referenceCoordinates[2][1] = new Coordinate[3];
referenceCoordinates[2][1][0] = coordinates[1];
referenceCoordinates[2][1][1] = coordinates[2];
referenceCoordinates[2][1][2] = coordinates[3];
referenceCoordinates[3][0] = new Coordinate[3];
referenceCoordinates[3][0][0] = coordinates[0];
referenceCoordinates[3][0][1] = coordinates[1];
referenceCoordinates[3][0][2] = new Coordinate(0.5, 1);
referenceCoordinates[3][1] = new Coordinate[3];
referenceCoordinates[3][1][0] = referenceCoordinates[3][0][2];
referenceCoordinates[3][1][1] = coordinates[2];
referenceCoordinates[3][1][2] = coordinates[3];
referenceCoordinates[4][0] = new Coordinate[3];
referenceCoordinates[4][0][0] = coordinates[0];
referenceCoordinates[4][0][1] = coordinates[1];
referenceCoordinates[4][0][2] = new Coordinate(1, 1);
referenceCoordinates[4][1] = new Coordinate[3];
referenceCoordinates[4][1][0] = referenceCoordinates[4][0][2];
referenceCoordinates[4][1][1] = coordinates[2];
referenceCoordinates[4][1][2] = coordinates[3];
referenceCoordinates[5][0] = new Coordinate[3];
referenceCoordinates[5][0][0] = coordinates[0];
referenceCoordinates[5][0][1] = coordinates[1];
referenceCoordinates[5][0][2] = new Coordinate(1.5, 1);
referenceCoordinates[5][1] = new Coordinate[3];
referenceCoordinates[5][1][0] = referenceCoordinates[5][0][2];
referenceCoordinates[5][1][1] = coordinates[2];
referenceCoordinates[5][1][2] = coordinates[3];
referenceCoordinates[6][0] = new Coordinate[3];
referenceCoordinates[6][0][0] = coordinates[0];
referenceCoordinates[6][0][1] = coordinates[1];
referenceCoordinates[6][0][2] = coordinates[2];
referenceCoordinates[6][1] = new Coordinate[2];
referenceCoordinates[6][1][0] = coordinates[2];
referenceCoordinates[6][1][1] = coordinates[3];
referenceCoordinates[7][0] = new Coordinate[4];
referenceCoordinates[7][0][0] = coordinates[0];
referenceCoordinates[7][0][1] = coordinates[1];
referenceCoordinates[7][0][2] = coordinates[2];
referenceCoordinates[7][0][3] = new Coordinate(2, 1.5);
referenceCoordinates[7][1] = new Coordinate[2];
referenceCoordinates[7][1][0] = referenceCoordinates[7][0][3];
referenceCoordinates[7][1][1] = coordinates[3];
referenceCoordinates[8][0] = coordinates;
GeometryFactory geometryFactory = GeometryUtils.getGeometryFactory();
CoordinateSequenceFactory coordinateSequenceFactory =
geometryFactory.getCoordinateSequenceFactory();
CoordinateSequence sequence = coordinateSequenceFactory.create(coordinates);
LineString geometry = new LineString(sequence, geometryFactory);
P2<LineString> result;
LineString[][] results = new LineString[9][2];
result = GeometryUtils.splitGeometryAtFraction(geometry, 0);
results[0][0] = result.first;
results[0][1] = result.second;
result = GeometryUtils.splitGeometryAtFraction(geometry, 0.125);
results[1][0] = result.first;
results[1][1] = result.second;
result = GeometryUtils.splitGeometryAtFraction(geometry, 0.25);
results[2][0] = result.first;
results[2][1] = result.second;
result = GeometryUtils.splitGeometryAtFraction(geometry, 0.375);
results[3][0] = result.first;
results[3][1] = result.second;
result = GeometryUtils.splitGeometryAtFraction(geometry, 0.5);
results[4][0] = result.first;
results[4][1] = result.second;
result = GeometryUtils.splitGeometryAtFraction(geometry, 0.625);
results[5][0] = result.first;
results[5][1] = result.second;
result = GeometryUtils.splitGeometryAtFraction(geometry, 0.75);
results[6][0] = result.first;
results[6][1] = result.second;
result = GeometryUtils.splitGeometryAtFraction(geometry, 0.875);
results[7][0] = result.first;
results[7][1] = result.second;
result = GeometryUtils.splitGeometryAtFraction(geometry, 1);
results[8][0] = result.first;
results[8][1] = result.second;
sequence = coordinateSequenceFactory.create(referenceCoordinates[0][0]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[0][0]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[0][1]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[0][1]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[1][0]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[1][0]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[1][1]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[1][1]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[2][0]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[2][0]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[2][1]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[2][1]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[3][0]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[3][0]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[3][1]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[3][1]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[4][0]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[4][0]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[4][1]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[4][1]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[5][0]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[5][0]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[5][1]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[5][1]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[6][0]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[6][0]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[6][1]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[6][1]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[7][0]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[7][0]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[7][1]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[7][1]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[8][0]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[8][0]);
sequence = coordinateSequenceFactory.create(referenceCoordinates[8][1]);
geometry = new LineString(sequence, geometryFactory);
assertEquals(geometry, results[8][1]);
}
}