package com.revolsys.geometry.test.old.perf.operation.distance; import java.util.List; import com.revolsys.geometry.densify.Densifier; import com.revolsys.geometry.model.BoundingBox; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.geometry.model.Point; import com.revolsys.geometry.model.Polygon; import com.revolsys.geometry.model.impl.PointDoubleXY; import com.revolsys.geometry.operation.distance.IndexedFacetDistance; import com.revolsys.geometry.test.old.algorithm.InteriorPointTest; import com.revolsys.geometry.test.old.junit.GeometryUtils; import com.revolsys.geometry.util.Stopwatch; /** * Tests performance of {@link IndexedFacetDistance} versus standard * using a grid of points to a target set of lines * * @author Martin Davis * */ public class TestPerfDistanceLinesPoints { static final double EXTENT = 1000; static GeometryFactory geomFact = GeometryFactory.DEFAULT_3D; static final int MAX_ITER = 1; static final int NUM_PTS_SIDE = 100; static final int NUM_TARGET_ITEMS = 4000; static final boolean USE_INDEXED_DIST = true; public static void main(final String[] args) { final TestPerfDistanceLinesPoints test = new TestPerfDistanceLinesPoints(); try { test.test(); } catch (final Exception ex) { ex.printStackTrace(); } } boolean verbose = true; public TestPerfDistanceLinesPoints() { } void computeDistance(final Geometry[] pts, final Geometry geom) { IndexedFacetDistance bbd = null; if (USE_INDEXED_DIST) { bbd = new IndexedFacetDistance(geom); } for (final Geometry pt : pts) { if (USE_INDEXED_DIST) { final double dist = bbd.getDistance(pt); // double dist = bbd.getDistanceWithin(pts[i].getCoordinate(), 100000); } else { final double dist = geom.distance(pt); } } } Geometry loadData(final String file) throws Exception { final List geoms = InteriorPointTest.getTestGeometries(file); return geomFact.buildGeometry(geoms); } List<Geometry> loadWKT(final String filename) throws Exception { return GeometryUtils.readWKTFile(filename); } Geometry newDiagonalCircles(final double extent, final int nSegs) { final Polygon[] circles = new Polygon[nSegs]; final double inc = extent / nSegs; for (int i = 0; i < nSegs; i++) { final double ord = i * inc; final Point p = new PointDoubleXY(ord, ord); final Geometry pt = geomFact.point(p); circles[i] = (Polygon)pt.buffer(inc / 2); } return geomFact.polygonal(circles); } Geometry newDiagonalLine(final double extent, final int nSegs) { final Point[] pts = new Point[nSegs + 1]; pts[0] = new PointDoubleXY(0, 0); final double inc = extent / nSegs; for (int i = 1; i <= nSegs; i++) { final double ord = i * inc; pts[i] = new PointDoubleXY(ord, ord); } return geomFact.lineString(pts); } Geometry newLine(final double extent, final int nSegs) { final Point[] pts = new Point[] { new PointDoubleXY(0, 0), new PointDoubleXY(0, extent), new PointDoubleXY(extent, extent), new PointDoubleXY(extent, 0) }; final Geometry outline = geomFact.lineString(pts); final double inc = extent / nSegs; return Densifier.densify(outline, inc); } Geometry[] newPoints(final BoundingBox extent, final int nPtsSide) { final Geometry[] pts = new Geometry[nPtsSide * nPtsSide]; int index = 0; final double xinc = extent.getWidth() / nPtsSide; final double yinc = extent.getHeight() / nPtsSide; for (int i = 0; i < nPtsSide; i++) { for (int j = 0; j < nPtsSide; j++) { pts[index++] = geomFact .point(new PointDoubleXY(extent.getMinX() + i * xinc, extent.getMinY() + j * yinc)); } } return pts; } public void test() throws Exception { // test(200); // if (true) return; // test(5000); // test(8001); // test(50); test(100); test(200); test(500); test(1000); // test(5000); // test(10000); // test(50000); // test(100000); } public void test(final Geometry[] pts, final Geometry target) { if (this.verbose) { // System.out.println("Query points = " + pts.length // + " Target points = " + target.getVertexCount()); // if (! verbose) System.out.print(num + ", "); } final Stopwatch sw = new Stopwatch(); final double dist = 0.0; for (int i = 0; i < MAX_ITER; i++) { computeDistance(pts, target); } if (!this.verbose) { // System.out.println(sw.getTimeString()); } if (this.verbose) { final String name = USE_INDEXED_DIST ? "IndexedFacetDistance" : "Distance"; // System.out.println(name + " - Run time: " + sw.getTimeString()); // System.out.println(" (Distance = " + dist + ")\n"); // System.out.println(); } } public void test(final int num) throws Exception { final Geometry target = newDiagonalCircles(EXTENT, NUM_TARGET_ITEMS); final Geometry[] pts = newPoints(target.getBoundingBox(), num); test(pts, target); } }