package mil.nga.giat.geowave.analytic; import java.util.Iterator; import java.util.List; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateList; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; public class GeometryGenerator { public static interface DistortationFn { double distort(); } /** * @param count * @param distanceactors * @param distortationFn * @param delta * @param env * @return */ public static Iterator<Geometry> generate( final int count, final List<Double> distanceactors, final DistortationFn distortationFn, final double delta, final Envelope env ) { // Create the star-ellipses for intersections later on return new Iterator<Geometry>() { int currentCount = 0; GeometryFactory geometryFactory = new GeometryFactory(); @Override public boolean hasNext() { return currentCount < count; } @Override public Geometry next() { // Thanks to Chris Bennight for the foundations of this code. currentCount++; double cx = env.centre().x * distortationFn.distort(); double cy = env.centre().y * distortationFn.distort(); double dx = env.getWidth() * distortationFn.distort(); double dy = env.getHeight() * distortationFn.distort(); // We will use a coordinate list to build the linear ring CoordinateList clist = new CoordinateList(); double angle = 0.0; for (int i = 0; angle < 360; angle += delta * distortationFn.distort() + delta, i++) { double a = distanceactors.get(i % distanceactors.size()) * dx * distortationFn.distort(); // double b = distanceactors.get(i % distanceactors.size()) // * dy * distortationFn.distort(); clist.add(new Coordinate( cx + a * Math.sin(Math.toRadians(angle)), cy + a * Math.cos(Math.toRadians(angle)))); } clist.add(clist.get(0)); return geometryFactory.createPolygon(clist.toCoordinateArray()); } @Override public void remove() { } }; } }