/* * Copyright (c) 2016 Martin Davis. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * * http://www.eclipse.org/org/documents/edl-v10.php. */ package test.jts.perf.operation.distance; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Polygon; import org.locationtech.jts.geom.util.SineStarFactory; import org.locationtech.jts.operation.distance.IndexedFacetDistance; import org.locationtech.jts.util.GeometricShapeFactory; import org.locationtech.jts.util.Stopwatch; public class TestPerfDistanceGeomPair { static final int MAX_ITER = 100; public static void main(String[] args) { TestPerfDistanceGeomPair test = new TestPerfDistanceGeomPair(); // test.test(); test.test2(); } boolean testFailed = false; boolean verbose = true; public TestPerfDistanceGeomPair() { } public void test() { // test(5000); // test(8001); test(10); test(10); test(100); test(500); test(1000); test(5000); test(10000); test(50000); test(100000); } public void test2() { verbose = false; for (int i = 100; i <= 2000; i += 100) { test(i); } } double size = 100; double separationDist = size * 2; public void test(int nPts) { // Geometry[] geom = createCircles(nPts); Geometry[] geom = createSineStars(nPts); if (verbose) System.out.println("Running with " + nPts + " points"); if (! verbose) System.out.print(nPts + ": "); test(geom); } public void test(Geometry[] geom) { Stopwatch sw = new Stopwatch(); double dist = 0.0; double dist2 = 0.0; for (int i = 0; i < MAX_ITER; i++) { // dist = geom[0].distance(geom[1]); // dist = SortedBoundsFacetDistance.distance(g1, g2); // dist2 = BranchAndBoundFacetDistance.distance(geom[0], geom[1]); // if (dist != dist2) System.out.println("distance discrepancy found!"); computeDistanceToAllPoints(geom); } if (! verbose) System.out.println(sw.getTimeString()); if (verbose) { System.out.println("Finished in " + sw.getTimeString()); System.out.println(" (Distance = " + dist + ")"); } } void computeDistanceToAllPoints(Geometry[] geom) { Coordinate[] pts = geom[1].getCoordinates(); double dist = 0.0; double dist2 = 0.0; IndexedFacetDistance fastDist = new IndexedFacetDistance(geom[0]); for (int i = 0; i < pts.length; i++) { Coordinate p = pts[i]; // slow N^2 distance dist = geom[0].distance(geom[1].getFactory().createPoint(p)); // dist2 = fastDist.getDistance(geom[1].getFactory().createPoint(p)); // if (dist != dist2) System.out.println("distance discrepancy found!"); } } Geometry[] createCircles(int nPts) { GeometricShapeFactory gsf = new GeometricShapeFactory(); gsf.setCentre(new Coordinate(0, 0)); gsf.setSize(100); gsf.setNumPoints(nPts); Polygon gRect = gsf.createCircle(); gsf.setCentre(new Coordinate(0, separationDist)); Polygon gRect2 = gsf.createCircle(); return new Geometry[] { gRect, gRect2 }; } Geometry[] createSineStars(int nPts) { SineStarFactory gsf = new SineStarFactory(); gsf.setCentre(new Coordinate(0, 0)); gsf.setSize(100); gsf.setNumPoints(nPts); Geometry g = gsf.createSineStar().getBoundary(); gsf.setCentre(new Coordinate(0, separationDist)); Geometry g2 = gsf.createSineStar().getBoundary(); return new Geometry[] { g, g2 }; } }