package org.osm2world.core.math.algorithms;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.osm2world.core.math.InvalidGeometryException;
import org.osm2world.core.math.LineSegmentXZ;
import org.osm2world.core.math.PolygonWithHolesXZ;
import org.osm2world.core.math.SimplePolygonXZ;
import org.osm2world.core.math.TriangleXZ;
import org.osm2world.core.math.VectorXZ;
import com.vividsolutions.jts.triangulate.ConstraintEnforcementException;
/**
* triangulation utility class that uses {@link EarClippingTriangulationUtil},
* and, as a fallback, {@link JTSTriangulationUtil}
*/
public class TriangulationUtil {
/**
* triangulates a two-dimensional polygon with holes and unconnected points.
*/
public static final List<TriangleXZ> triangulate(
SimplePolygonXZ outerPolygon,
Collection<SimplePolygonXZ> holes,
Collection<VectorXZ> points) {
if (points.isEmpty() && outerPolygon.size() <= 100) {
try {
return EarClippingTriangulationUtil.triangulate(outerPolygon, holes);
} catch (InvalidGeometryException e) {
//TODO (error handling): log failed triangulations properly (as info)
// e.printStackTrace();
// System.err.println("outer: " + outerPolygon);
// System.err.println("holes: " + holes);
// System.err.println("using JTS triangulation instead");
}
}
/* use JTS if there are unconnected points, or as a fallback */
try {
return JTSTriangulationUtil.triangulate(outerPolygon, holes,
Collections.<LineSegmentXZ>emptyList(), points);
} catch (ConstraintEnforcementException e2) {
e2.printStackTrace();
System.err.println("outer: " + outerPolygon);
System.err.println("holes: " + holes);
System.err.println("JTS triangulation failed, returning empty list");
return Collections.emptyList();
}
}
/**
* triangulates a two-dimensional polygon with holes.
*/
public static final List<TriangleXZ> triangulate(
SimplePolygonXZ outerPolygon,
Collection<SimplePolygonXZ> holes) {
return triangulate(outerPolygon, holes,
Collections.<VectorXZ>emptyList());
}
/**
* @see #triangulate(SimplePolygonXZ, Collection)
*/
public static final List<TriangleXZ> triangulate(
PolygonWithHolesXZ polygon,
Collection<VectorXZ> points) {
return triangulate(polygon.getOuter(), polygon.getHoles(), points);
}
/**
* @see #triangulate(SimplePolygonXZ, Collection)
*/
public static final List<TriangleXZ> triangulate(
PolygonWithHolesXZ polygon) {
return triangulate(polygon.getOuter(), polygon.getHoles());
}
}