/*
* 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.triangulate;
import java.util.ArrayList;
import java.util.List;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.triangulate.DelaunayTriangulationBuilder;
import org.locationtech.jts.util.Memory;
import org.locationtech.jts.util.Stopwatch;
/**
* Test robustness of Delaunay computation.
* Test dataset is constructed to have many points
* with a large base offset. This reduces
* the precision available for the arithmetic in the inCircle test.
* This causes incorrect values to be computed by using
* the simple double-precision approach.
*
* @author Martin Davis
*
*/
public class DelaunayRobustTest
{
public static void main(String args[]) {
DelaunayRobustTest test = new DelaunayRobustTest();
test.run();
}
public void run()
{
run(100000);
}
final static GeometryFactory geomFact = new GeometryFactory();
final static double SIDE_LEN = 1.0;
final static double BASE_OFFSET = 1.0e7;
public void run(int nPts)
{
System.out.println("Base offset: " + BASE_OFFSET);
List pts = randomPointsInGrid(nPts, BASE_OFFSET, BASE_OFFSET);
System.out.println("# pts: " + pts.size());
Stopwatch sw = new Stopwatch();
DelaunayTriangulationBuilder builder = new DelaunayTriangulationBuilder();
builder.setSites(pts);
// Geometry g = builder.getEdges(geomFact);
// don't actually form output geometry, to save time and memory
builder.getSubdivision();
System.out.println(" -- Time: " + sw.getTimeString()
+ " Mem: " + Memory.usedTotalString());
// System.out.println(g);
}
List randomPointsInGrid(int nPts, double basex, double basey)
{
List pts = new ArrayList();
int nSide = (int) Math.sqrt(nPts) + 1;
for (int i = 0; i < nSide; i++) {
for (int j = 0; j < nSide; j++) {
double x = basex + i * SIDE_LEN + SIDE_LEN * Math.random();
double y = basey + j * SIDE_LEN + SIDE_LEN * Math.random();
pts.add(new Coordinate(x, y));
}
}
return pts;
}
List randomPoints(int nPts)
{
List pts = new ArrayList();
for (int i = 0; i < nPts; i++) {
double x = SIDE_LEN * Math.random();
double y = SIDE_LEN * Math.random();
pts.add(new Coordinate(x, y));
}
return pts;
}
}