/*
* 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.algorithm;
import org.locationtech.jts.algorithm.locate.PointOnGeometryLocator;
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.Location;
import org.locationtech.jts.util.Stopwatch;
/**
* Creates a perturbed, buffered grid and tests a set
* of points against using two PointInArea classes.
*
* @author mbdavis
*
*/
public class PointInAreaPerfTester
{
private GeometryFactory geomFactory;
private Geometry area;
private int numPts = 10000;
private PointOnGeometryLocator pia1;
private int[] locationCount = new int[3];
public PointInAreaPerfTester(GeometryFactory geomFactory, Geometry area)
{
this.geomFactory = geomFactory;
this.area = area;
}
public void setNumPoints(int numPoints)
{
this.numPts = numPoints;
}
public void setPIA(PointOnGeometryLocator pia)
{
this.pia1 = pia;
}
/**
*
* @return true if all point locations were computed correctly
*/
public boolean run()
{
Stopwatch sw = new Stopwatch();
int ptGridWidth = (int) Math.sqrt(numPts);
Envelope areaEnv = area.getEnvelopeInternal();
double xStep = areaEnv.getWidth() / (ptGridWidth - 1);
double yStep = areaEnv.getHeight() / (ptGridWidth - 1);
for (int i = 0; i < ptGridWidth; i++) {
for (int j = 0; j < ptGridWidth; j++) {
// compute test point
double x = areaEnv.getMinX() + i * xStep;
double y = areaEnv.getMinY() + j * yStep;
Coordinate pt = new Coordinate(x, y);
geomFactory.getPrecisionModel().makePrecise(pt);
int loc = pia1.locate(pt);
locationCount[loc]++;
}
}
System.out.println("Test completed in " + sw.getTimeString());
printStats();
return true;
}
public void printStats()
{
System.out.println("Location counts: "
+ " Boundary = " + locationCount[Location.BOUNDARY]
+ " Interior = " + locationCount[Location.INTERIOR]
+ " Exterior = " + locationCount[Location.EXTERIOR]
);
}
}