public class MinimumDiameter
extends java.lang.Object
Geometry
.
The minimum diameter is defined to be the
width of the smallest band that
contains the geometry,
where a band is a strip of the plane defined
by two parallel lines.
This can be thought of as the smallest hole that the geometry can be
moved through, with a single rotation.
The first step in the algorithm is computing the convex hull of the Geometry. If the input Geometry is known to be convex, a hint can be supplied to avoid this computation.
This class can also be used to compute a line segment representing the minimum diameter, the supporting line segment of the minimum diameter, and a minimum rectangle enclosing the input geometry. This rectangle will have width equal to the minimum diameter, and have one side parallel to the supporting segment.
ConvexHull
Modifier and Type | Field and Description |
---|---|
private Coordinate[] |
convexHullPts |
private Geometry |
inputGeom |
private boolean |
isConvex |
private LineSegment |
minBaseSeg |
private int |
minPtIndex |
private double |
minWidth |
private Coordinate |
minWidthPt |
Constructor and Description |
---|
MinimumDiameter(Geometry inputGeom)
Compute a minimum diameter for a given
Geometry . |
MinimumDiameter(Geometry inputGeom,
boolean isConvex)
Compute a minimum diameter for a giver
Geometry ,
with a hint if
the Geometry is convex
(e.g. |
Modifier and Type | Method and Description |
---|---|
private static double |
computeC(double a,
double b,
Coordinate p) |
private void |
computeConvexRingMinDiameter(Coordinate[] pts)
Compute the width information for a ring of
Coordinate s. |
private void |
computeMinimumDiameter() |
private static LineSegment |
computeSegmentForLine(double a,
double b,
double c) |
private void |
computeWidthConvex(Geometry convexGeom) |
private int |
findMaxPerpDistance(Coordinate[] pts,
LineSegment seg,
int startIndex) |
LineString |
getDiameter()
Gets a
LineString which is a minimum diameter |
double |
getLength()
Gets the length of the minimum diameter of the input Geometry
|
static Geometry |
getMinimumDiameter(Geometry geom)
Gets the length of the minimum diameter enclosing a geometry
|
Geometry |
getMinimumRectangle()
Gets the minimum rectangular
Polygon which encloses the input geometry. |
static Geometry |
getMinimumRectangle(Geometry geom)
Gets the minimum rectangle enclosing a geometry.
|
LineString |
getSupportingSegment()
Gets the segment forming the base of the minimum diameter
|
Coordinate |
getWidthCoordinate()
Gets the
Coordinate forming one end of the minimum diameter |
private static int |
nextIndex(Coordinate[] pts,
int index) |
private final Geometry inputGeom
private final boolean isConvex
private Coordinate[] convexHullPts
private LineSegment minBaseSeg
private Coordinate minWidthPt
private int minPtIndex
private double minWidth
public MinimumDiameter(Geometry inputGeom)
Geometry
.inputGeom
- a Geometrypublic MinimumDiameter(Geometry inputGeom, boolean isConvex)
Geometry
,
with a hint if
the Geometry is convex
(e.g. a convex Polygon or LinearRing,
or a two-point LineString, or a Point).inputGeom
- a Geometry which is convexisConvex
- true
if the input geometry is convexpublic static Geometry getMinimumRectangle(Geometry geom)
geom
- the geometrypublic static Geometry getMinimumDiameter(Geometry geom)
geom
- the geometrypublic double getLength()
public Coordinate getWidthCoordinate()
Coordinate
forming one end of the minimum diameterpublic LineString getSupportingSegment()
public LineString getDiameter()
LineString
which is a minimum diameterLineString
which is a minimum diameterprivate void computeMinimumDiameter()
private void computeWidthConvex(Geometry convexGeom)
private void computeConvexRingMinDiameter(Coordinate[] pts)
Coordinate
s.
Leaves the width information in the instance variables.pts
- private int findMaxPerpDistance(Coordinate[] pts, LineSegment seg, int startIndex)
private static int nextIndex(Coordinate[] pts, int index)
public Geometry getMinimumRectangle()
Polygon
which encloses the input geometry.
The rectangle has width equal to the minimum diameter,
and a longer length.
If the convex hull of the input is degenerate (a line or point)
a LineString
or Point
is returned.
The minimum rectangle can be used as an extremely generalized representation for the given geometry.
private static double computeC(double a, double b, Coordinate p)
private static LineSegment computeSegmentForLine(double a, double b, double c)