/*
* 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.predicate;
import java.util.ArrayList;
import java.util.List;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.PrecisionModel;
import org.locationtech.jts.geom.util.SineStarFactory;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.WKTWriter;
import org.locationtech.jts.precision.GeometryPrecisionReducer;
import org.locationtech.jts.util.GeometricShapeFactory;
import org.locationtech.jts.util.Stopwatch;
public class RectangleIntersectsPerfTest
{
static final int MAX_ITER = 10;
static final int NUM_AOI_PTS = 2000;
static final int NUM_LINES = 5000;
static final int NUM_LINE_PTS = 1000;
static PrecisionModel pm = new PrecisionModel();
static GeometryFactory fact = new GeometryFactory(pm, 0);
static WKTReader wktRdr = new WKTReader(fact);
static WKTWriter wktWriter = new WKTWriter();
Stopwatch sw = new Stopwatch();
public static void main(String[] args) {
RectangleIntersectsPerfTest test = new RectangleIntersectsPerfTest();
test.test();
}
boolean testFailed = false;
public RectangleIntersectsPerfTest() {
}
public void test()
{
// test(5);
// test(10);
test(500);
// test(1000);
// test(2000);
test(100000);
/*
test(100);
test(1000);
test(2000);
test(4000);
test(8000);
*/
}
void test(int nPts)
{
double size = 100;
Coordinate origin = new Coordinate(0, 0);
Geometry sinePoly = createSineStar(origin, size, nPts).getBoundary();
/**
* Make the geometry "crinkly" by rounding off the points.
* This defeats the MonotoneChain optimization in the full relate
* algorithm, and provides a more realistic test.
*/
Geometry sinePolyCrinkly = GeometryPrecisionReducer.reduce(sinePoly,
new PrecisionModel(size / 10));
Geometry target = sinePolyCrinkly;
Geometry rect = createRectangle(origin, 5);
// System.out.println(target);
//System.out.println("Running with " + nPts + " points");
testRectangles(target, 100, 5);
}
void testRectangles(Geometry target, int nRect, double rectSize)
{
Geometry[] rects = createRectangles(target.getEnvelopeInternal(), nRect, rectSize);
test(rects, target);
}
void test(Geometry[] rect, Geometry g)
{
System.out.println("Target # pts: " + g.getNumPoints()
+ " -- # Rectangles: " + rect.length
);
int maxCount = MAX_ITER;
Stopwatch sw = new Stopwatch();
int count = 0;
for (int i = 0; i < MAX_ITER; i++) {
for (int j = 0; j < rect.length; j++) {
// rect[j].relate(g);
rect[j].intersects(g);
}
}
System.out.println("Finished in " + sw.getTimeString());
System.out.println();
}
/**
* Creates a set of rectangular Polygons which
* cover the given envelope.
* The rectangles
* At least nRect rectangles are created.
*
* @param env
* @param nRect
* @param rectSize
* @return
*/
Geometry[] createRectangles(Envelope env, int nRect, double rectSize )
{
int nSide = 1 + (int)Math.sqrt((double) nRect);
double dx = env.getWidth() / nSide;
double dy = env.getHeight() / nSide;
List rectList = new ArrayList();
for (int i = 0; i < nSide; i++) {
for (int j = 0; j < nSide; j++) {
double baseX = env.getMinX() + i * dx;
double baseY = env.getMinY() + j * dy;
Envelope envRect = new Envelope(
baseX, baseX + dx,
baseY, baseY + dy);
Geometry rect = fact.toGeometry(envRect);
rectList.add(rect);
}
}
return GeometryFactory.toGeometryArray(rectList);
}
Geometry createRectangle(Coordinate origin, double size) {
GeometricShapeFactory gsf = new GeometricShapeFactory();
gsf.setCentre(origin);
gsf.setSize(size);
gsf.setNumPoints(4);
Geometry g = gsf.createRectangle();
// Polygon gRect = gsf.createRectangle();
// Geometry g = gRect.getExteriorRing();
return g;
}
Geometry createSineStar(Coordinate origin, double size, int nPts) {
SineStarFactory gsf = new SineStarFactory();
gsf.setCentre(origin);
gsf.setSize(size);
gsf.setNumPoints(nPts);
gsf.setArmLengthRatio(2);
gsf.setNumArms(20);
Geometry poly = gsf.createSineStar();
return poly;
}
}