package org.jgrasstools.gears.utils.features; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import org.geotools.geometry.jts.LiteCoordinateSequence; import org.geotools.geometry.jts.LiteShape; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.geom.prep.PreparedGeometry; import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory; /** * A {@link LiteShape} subclass using PreparedGeometry to compute the results of the containment * methods. This class is _not_ thread safe * * @author Andrea Aime - GeoSolutions * */ public final class FastLiteShape extends LiteShape { PreparedGeometry prepared; LiteCoordinateSequence pointCS; Point point; LiteCoordinateSequence rectCS; Polygon rect; public FastLiteShape( Geometry geom ) { super(geom, new AffineTransform(), false); this.prepared = PreparedGeometryFactory.prepare(geom); GeometryFactory gf = new GeometryFactory(); pointCS = new LiteCoordinateSequence(1, 2); point = gf.createPoint(pointCS); rectCS = new LiteCoordinateSequence(5, 2); rect = gf.createPolygon(gf.createLinearRing(rectCS), null); // System.out.println("Crop area: " + geom); } @Override public boolean contains( double x, double y ) { pointCS.setX(0, x); pointCS.setY(0, y); point.geometryChanged(); final boolean result = prepared.contains(point); // System.out.println("Poking " + x + ", " + y + " -> " + result); return result; } @Override public boolean contains( Point2D p ) { return contains(p.getX(), p.getY()); } @Override public boolean contains( double x, double y, double w, double h ) { updateRect(x, y, w, h); return prepared.contains(rect); } private void updateRect( double x, double y, double w, double h ) { rectCS.setX(0, x); rectCS.setY(0, y); rectCS.setX(1, x + w); rectCS.setY(1, y); rectCS.setX(2, x + w); rectCS.setY(2, y + h); rectCS.setX(3, x); rectCS.setY(3, y + h); rectCS.setX(4, x); rectCS.setY(4, y); rect.geometryChanged(); } @Override public boolean contains( Rectangle2D r ) { return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } @Override public boolean intersects( double x, double y, double w, double h ) { updateRect(x, y, w, h); return prepared.intersects(rect); } @Override public boolean intersects( Rectangle2D r ) { return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } }