/* * Copyright (c) 2016 Vivid Solutions. * * 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.union; import java.util.ArrayList; import java.util.List; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.PrecisionModel; import org.locationtech.jts.io.WKTReader; import org.locationtech.jts.io.WKTWriter; import org.locationtech.jts.util.GeometricShapeFactory; public class PolygonUnionPerfTest { static final int MAX_ITER = 1; static PrecisionModel pm = new PrecisionModel(); static GeometryFactory fact = new GeometryFactory(pm, 0); static WKTReader wktRdr = new WKTReader(fact); static WKTWriter wktWriter = new WKTWriter(); GeometryFactory factory = new GeometryFactory(); public static void main(String[] args) { PolygonUnionPerfTest test = new PolygonUnionPerfTest(); // test.test(); test.testRampItems(); } boolean testFailed = false; public PolygonUnionPerfTest() { } public void testRampItems() { int nPts = 1000; test(5, nPts, 10.0); test(5, nPts, 10.0); test(25, nPts, 10.0); test(50, nPts, 10.0); test(100, nPts, 10.0); test(200, nPts, 10.0); test(400, nPts, 10.0); test(500, nPts, 10.0); test(1000, nPts, 10.0); test(2000, nPts, 10.0); test(4000, nPts, 10.0); } public void test() { // test(5, 100, 10.0); test(1000, 100, 10.0); } public void test(int nItems, int nPts, double size) { System.out.println("---------------------------------------------------------"); System.out.println("# pts/item: " + nPts); List polys = createPolys(nItems, size, nPts); // System.out.println(); //System.out.println("Running with " + nPts + " points"); UnionPerfTester tester = new UnionPerfTester(polys); tester.runAll(); } /** * Creates a grid of circles with a small percentage of overlap * in both directions. * This approximated likely real-world cases well, * and seems to produce * close to worst-case performance for the Iterated algorithm. * * Sample times: * 1000 items/100 pts - Cascaded: 2718 ms, Iterated 150 s * * @param nItems * @param size * @param nPts * @return */ List createPolys(int nItems, double size, int nPts) { // between 0 and 1 double overlapPct = 0.2; int nCells = (int) Math.sqrt(nItems); List geoms = new ArrayList(); // double width = env.getWidth(); double width = nCells * (1 - overlapPct) * size; // this results in many final polys double height = nCells * 2 * size; // this results in a single final polygon // double height = width; double xInc = width / nCells; double yInc = height / nCells; for (int i = 0; i < nCells; i++) { for (int j = 0; j < nCells; j++) { Coordinate base = new Coordinate( i * xInc, j * yInc); Geometry poly = createPoly(base, size, nPts); geoms.add(poly); // System.out.println(poly); } } return geoms; } Geometry createPoly(Coordinate base, double size, int nPts) { GeometricShapeFactory gsf = new GeometricShapeFactory(factory); gsf.setCentre(base); gsf.setSize(size); gsf.setNumPoints(nPts); Geometry poly = gsf.createCircle(); // Geometry poly = gsf.createRectangle(); // System.out.println(circle); return poly; } }