public class BufferInputLineSimplifier
extends java.lang.Object
The most important benefit of doing this is to reduce the number of points and the complexity of shape which will be buffered. It also reduces the risk of gores created by the quantized fillet arcs (although this issue should be eliminated in any case by the offset curve generation logic).
A key aspect of the simplification is that it affects inside (concave or inward) corners only. Convex (outward) corners are preserved, since they are required to ensure that the generated buffer curve lies at the correct distance from the input geometry.
Another important heuristic used is that the end segments of the input are never simplified. This ensures that the client buffer code is able to generate end caps faithfully.
No attempt is made to avoid self-intersections in the output. This is acceptable for use for generating a buffer offset curve, since the buffer algorithm is insensitive to invalid polygonal geometry. However, this means that this algorithm cannot be used as a general-purpose polygon simplification technique.
Modifier and Type | Field and Description |
---|---|
private int |
angleOrientation |
private static int |
DELETE |
private double |
distanceTol |
private static int |
INIT |
private Coordinate[] |
inputLine |
private byte[] |
isDeleted |
private static int |
KEEP |
private static int |
NUM_PTS_TO_CHECK |
Constructor and Description |
---|
BufferInputLineSimplifier(Coordinate[] inputLine) |
Modifier and Type | Method and Description |
---|---|
private Coordinate[] |
collapseLine() |
private boolean |
deleteShallowConcavities()
Uses a sliding window containing 3 vertices to detect shallow angles
in which the middle vertex can be deleted, since it does not
affect the shape of the resulting buffer in a significant way.
|
private int |
findNextNonDeletedIndex(int index)
Finds the next non-deleted index, or the end of the point array if none
|
private boolean |
isConcave(Coordinate p0,
Coordinate p1,
Coordinate p2) |
private boolean |
isDeletable(int i0,
int i1,
int i2,
double distanceTol) |
private boolean |
isShallow(Coordinate p0,
Coordinate p1,
Coordinate p2,
double distanceTol) |
private boolean |
isShallowConcavity(Coordinate p0,
Coordinate p1,
Coordinate p2,
double distanceTol) |
private boolean |
isShallowSampled(Coordinate p0,
Coordinate p2,
int i0,
int i2,
double distanceTol)
Checks for shallowness over a sample of points in the given section.
|
static Coordinate[] |
simplify(Coordinate[] inputLine,
double distanceTol)
Simplify the input coordinate list.
|
Coordinate[] |
simplify(double distanceTol)
Simplify the input coordinate list.
|
private static final int INIT
private static final int DELETE
private static final int KEEP
private Coordinate[] inputLine
private double distanceTol
private byte[] isDeleted
private int angleOrientation
private static final int NUM_PTS_TO_CHECK
public BufferInputLineSimplifier(Coordinate[] inputLine)
public static Coordinate[] simplify(Coordinate[] inputLine, double distanceTol)
inputLine
- the coordinate list to simplifydistanceTol
- simplification distance tolerance to usepublic Coordinate[] simplify(double distanceTol)
distanceTol
- simplification distance tolerance to useprivate boolean deleteShallowConcavities()
private int findNextNonDeletedIndex(int index)
index
- private Coordinate[] collapseLine()
private boolean isDeletable(int i0, int i1, int i2, double distanceTol)
private boolean isShallowConcavity(Coordinate p0, Coordinate p1, Coordinate p2, double distanceTol)
private boolean isShallowSampled(Coordinate p0, Coordinate p2, int i0, int i2, double distanceTol)
p0
- start coordinate of sectionp2
- end coordinate of sectioni0
- start index of sectioni2
- end index of sectiondistanceTol
- distance toleranceprivate boolean isShallow(Coordinate p0, Coordinate p1, Coordinate p2, double distanceTol)
private boolean isConcave(Coordinate p0, Coordinate p1, Coordinate p2)