/*
* The JTS Topology Suite is a collection of Java classes that
* implement the fundamental operations required to validate a given
* geo-spatial data set to a known topological specification.
*
* Copyright (C) 2001 Vivid Solutions
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For more information, contact:
*
* Vivid Solutions
* Suite #1A
* 2328 Government Street
* Victoria BC V8T 5G5
* Canada
*
* (250)385-6040
* www.vividsolutions.com
*/
package com.revolsys.geometry.shape;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.Point;
import com.revolsys.geometry.model.impl.BoundingBoxDoubleXY;
import com.revolsys.geometry.model.segment.LineSegment;
import com.revolsys.geometry.model.segment.LineSegmentDouble;
public abstract class GeometricShapeBuilder {
protected BoundingBox extent = new BoundingBoxDoubleXY(0, 0, 1, 1);
protected GeometryFactory geometryFactory;
protected int numPts = 0;
public GeometricShapeBuilder(final GeometryFactory geomFactory) {
this.geometryFactory = geomFactory.convertScales(1.0, 1.0);
}
public Point getCentre() {
return this.extent.getCentre();
}
public double getDiameter() {
return Math.min(this.extent.getHeight(), this.extent.getWidth());
}
public BoundingBox getExtent() {
return this.extent;
}
public abstract Geometry getGeometry();
public double getRadius() {
return getDiameter() / 2;
}
public LineSegment getSquareBaseLine() {
final double radius = getRadius();
final Point centre = getCentre();
final double x1 = centre.getX() - radius;
final double y1 = centre.getY() - radius;
final double x2 = centre.getX() + radius;
return new LineSegmentDouble(2, x1, y1, x2, y1);
}
public BoundingBox getSquareExtent() {
final double radius = getRadius();
final Point centre = getCentre();
return new BoundingBoxDoubleXY(centre.getX() - radius, centre.getY() - radius,
centre.getX() + radius, centre.getY() + radius);
}
protected Point newPoint(final double x, final double y) {
return this.geometryFactory.point(x, y);
}
public void setExtent(final BoundingBox extent) {
this.extent = extent;
}
/**
* Sets the total number of points in the created {@link Geometry}.
* The created geometry will have no more than this number of points,
* unless more are needed to Construct a new valid geometry.
*/
public void setNumPoints(final int numPts) {
this.numPts = numPts;
}
}