/*
* 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 org.locationtech.jts.algorithm;
import java.util.Random;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.LineString;
import org.locationtech.jts.geom.MultiLineString;
public class PerturbedGridPolygonBuilder
{
private GeometryFactory geomFactory;
private double gridWidth = 1000;
private int numLines = 10;
private double lineWidth = 20;
private long seed = 0;
private Random rand;
private Geometry grid;
public PerturbedGridPolygonBuilder(GeometryFactory geomFactory)
{
this.geomFactory = geomFactory;
seed = System.currentTimeMillis();
}
public void setSeed(long seed)
{
this.seed = seed;
}
public void setNumLines(int numLines)
{
this.numLines = numLines;
}
public void setLineWidth(double lineWidth)
{
this.lineWidth = lineWidth;
}
public Geometry getGeometry()
{
if (grid == null)
grid = buildGrid();
return grid;
}
private Geometry buildGrid()
{
LineString[] lines = new LineString[numLines * 2];
int index = 0;
for (int i = 0; i < numLines; i++) {
Coordinate p0 = new Coordinate(getRandOrdinate(), 0);
Coordinate p1 = new Coordinate(getRandOrdinate(), gridWidth);
LineString line = geomFactory.createLineString(
new Coordinate[] { p0, p1 });
lines[index++] = line;
}
for (int i = 0; i < numLines; i++) {
Coordinate p0 = new Coordinate(0, getRandOrdinate());
Coordinate p1 = new Coordinate(gridWidth, getRandOrdinate());
LineString line = geomFactory.createLineString(
new Coordinate[] { p0, p1 });
lines[index++] = line;
}
MultiLineString ml = geomFactory.createMultiLineString(lines);
Geometry grid = ml.buffer(lineWidth);
//System.out.println(grid);
return grid;
}
private double getRand()
{
if (rand == null) {
//System.out.println("Seed = " + seed);
rand = new Random(seed);
}
return rand.nextDouble();
}
private double getRandOrdinate()
{
double randNum = getRand();
double ord = geomFactory.getPrecisionModel().makePrecise(randNum * gridWidth);
return ord;
}
}