|
|||||||||
| Home >> All >> java >> awt >> [ geom overview ] | PREV CLASS NEXT CLASS | ||||||||
SUMMARY: JAVADOC | SOURCE | DOWNLOAD | NESTED | FIELD | CONSTR | METHOD |
DETAIL: FIELD | CONSTR | METHOD | ||||||||
java.awt.geom
Class FlatteningPathIterator

java.lang.Objectjava.awt.geom.FlatteningPathIterator
- All Implemented Interfaces:
- PathIterator
- public class FlatteningPathIterator
- extends java.lang.Object
- implements PathIterator
- extends java.lang.Object
A PathIterator for approximating curved path segments by sequences
of straight lines. Instances of this class will only return
segments of type PathIterator.SEG_MOVETO 55 , PathIterator.SEG_LINETO 55 , and PathIterator.SEG_CLOSE 55 .
The accuracy of the approximation is determined by two parameters:
- The flatness is a threshold value for deciding when
a curved segment is consided flat enough for being approximated by
a single straight line. Flatness is defined as the maximal distance
of a curve control point to the straight line that connects the
curve start and end. A lower flatness threshold means a closer
approximation. See
QuadCurve2D.getFlatness()55 andCubicCurve2D.getFlatness()55 for drawings which illustrate the meaning of flatness. - The recursion limit imposes an upper bound for how often
a curved segment gets subdivided. A limit of n means that
for each individual quadratic and cubic Bézier spline
segment, at most 2n
PathIterator.SEG_LINETO55 segments will be created.
Memory Efficiency: The memory consumption grows linearly with the recursion limit. Neither the flatness parameter nor the number of segments in the flattened path will affect the memory consumption.
Thread Safety: Multiple threads can safely work on separate instances of this class. However, multiple threads should not concurrently access the same instance, as no synchronization is performed.
- Since:
- 1.2
| Field Summary | |
private boolean |
done
A flag that indicates when this path iterator has finished its iteration over path segments. |
private double |
flatnessSq
The square of the flatness threshold value, which determines when a curve segment is considered flat enough that no further subdivision is needed. |
private int[] |
recLevel
The number of recursions that were performed to arrive at a segment on the stack. |
private int |
recursionLimit
The maximal number of subdivions that are performed to approximate a quadratic or cubic curve segment. |
private double[] |
scratch
|
private PathIterator |
srcIter
The PathIterator whose curved segments are being approximated. |
private double |
srcPosX
The current x position of the source iterator. |
private double |
srcPosY
The current y position of the source iterator. |
private int |
srcSegType
The segment type of the last segment that was returned by the source iterator. |
private double[] |
stack
A stack for holding the coordinates of subdivided segments. |
private int |
stackSize
The current stack size. |
| Fields inherited from interface java.awt.geom.PathIterator |
SEG_CLOSE, SEG_CUBICTO, SEG_LINETO, SEG_MOVETO, SEG_QUADTO, WIND_EVEN_ODD, WIND_NON_ZERO |
| Constructor Summary | |
FlatteningPathIterator(PathIterator src,
double flatness)
Constructs a new PathIterator for approximating an input PathIterator with straight lines. |
|
FlatteningPathIterator(PathIterator src,
double flatness,
int limit)
Constructs a new PathIterator for approximating an input PathIterator with straight lines. |
|
| Method Summary | |
int |
currentSegment(double[] coords)
Returns the coordinates of the next point(s), as well as the type of line segment. |
int |
currentSegment(float[] coords)
Returns the coordinates of the next point(s), as well as the type of line segment. |
private void |
fetchSegment()
Fetches the next segment from the source iterator. |
double |
getFlatness()
Returns the maximally acceptable flatness. |
int |
getRecursionLimit()
Returns the maximum number of recursive curve subdivisions. |
int |
getWindingRule()
Returns the winding rule to determine which points are inside this path. |
boolean |
isDone()
Tests if the iterator is exhausted. |
void |
next()
Advance to the next segment in the iteration. |
private void |
subdivideCubic()
Repeatedly subdivides the cubic curve segment that is on top of the stack. |
private void |
subdivideQuadratic()
Repeatedly subdivides the quadratic curve segment that is on top of the stack. |
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
srcIter
private final PathIterator srcIter
- The PathIterator whose curved segments are being approximated.
flatnessSq
private final double flatnessSq
- The square of the flatness threshold value, which determines when
a curve segment is considered flat enough that no further
subdivision is needed.
Calculating flatness actually produces the squared flatness value. To avoid the relatively expensive calculation of a square root for each curve segment, we perform all flatness comparisons on squared values.
- See Also:
QuadCurve2D.getFlatnessSq()55 ,CubicCurve2D.getFlatnessSq()55
recursionLimit
private final int recursionLimit
- The maximal number of subdivions that are performed to
approximate a quadratic or cubic curve segment.
stack
private double[] stack
- A stack for holding the coordinates of subdivided segments.
- See Also:
- Implementation Note
stackSize
private int stackSize
- The current stack size.
- See Also:
- Implementation Note
recLevel
private int[] recLevel
- The number of recursions that were performed to arrive at
a segment on the stack.
- See Also:
- Implementation Note
scratch
private final double[] scratch
srcSegType
private int srcSegType
- The segment type of the last segment that was returned by
the source iterator.
srcPosX
private double srcPosX
- The current x position of the source iterator.
srcPosY
private double srcPosY
- The current y position of the source iterator.
done
private boolean done
- A flag that indicates when this path iterator has finished its
iteration over path segments.
| Constructor Detail |
FlatteningPathIterator
public FlatteningPathIterator(PathIterator src, double flatness)
- Constructs a new PathIterator for approximating an input
PathIterator with straight lines. The approximation works by
recursive subdivisons, until the specified flatness threshold is
not exceeded.
There will not be more than 10 nested recursion steps, which means that a single
SEG_QUADTOorSEG_CUBICTOsegment is approximated by at most 210 = 1024 straight lines.
FlatteningPathIterator
public FlatteningPathIterator(PathIterator src, double flatness, int limit)
- Constructs a new PathIterator for approximating an input
PathIterator with straight lines. The approximation works by
recursive subdivisons, until the specified flatness threshold is
not exceeded. Additionally, the number of recursions is also
bound by the specified recursion limit.
| Method Detail |
getFlatness
public double getFlatness()
- Returns the maximally acceptable flatness.
getRecursionLimit
public int getRecursionLimit()
- Returns the maximum number of recursive curve subdivisions.
getWindingRule
public int getWindingRule()
- Description copied from interface:
PathIterator - Returns the winding rule to determine which points are inside this path.
- Specified by:
getWindingRulein interfacePathIterator
isDone
public boolean isDone()
- Description copied from interface:
PathIterator - Tests if the iterator is exhausted. If this returns true, currentSegment
and next may throw a NoSuchElementException (although this is not
required).
- Specified by:
isDonein interfacePathIterator
next
public void next()
- Description copied from interface:
PathIterator - Advance to the next segment in the iteration. It is not specified what
this does if called when isDone() returns true.
- Specified by:
nextin interfacePathIterator
currentSegment
public int currentSegment(double[] coords)
- Description copied from interface:
PathIterator - Returns the coordinates of the next point(s), as well as the type of
line segment. The input array must be at least a double[6], to accomodate
up to three (x,y) point pairs (although if you know the iterator is
flat, you can probably get by with a double[2]). If the returned type is
SEG_MOVETO or SEG_LINETO, the first point in the array is modified; if
the returned type is SEG_QUADTO, the first two points are modified; if
the returned type is SEG_CUBICTO, all three points are modified; and if
the returned type is SEG_CLOSE, the array is untouched.
- Specified by:
currentSegmentin interfacePathIterator
currentSegment
public int currentSegment(float[] coords)
- Description copied from interface:
PathIterator - Returns the coordinates of the next point(s), as well as the type of
line segment. The input array must be at least a float[6], to accomodate
up to three (x,y) point pairs (although if you know the iterator is
flat, you can probably get by with a float[2]). If the returned type is
SEG_MOVETO or SEG_LINETO, the first point in the array is modified; if
the returned type is SEG_QUADTO, the first two points are modified; if
the returned type is SEG_CUBICTO, all three points are modified; and if
the returned type is SEG_CLOSE, the array is untouched.
- Specified by:
currentSegmentin interfacePathIterator
fetchSegment
private void fetchSegment()
- Fetches the next segment from the source iterator.
subdivideQuadratic
private void subdivideQuadratic()
- Repeatedly subdivides the quadratic curve segment that is on top
of the stack. The iteration terminates when the recursion limit
has been reached, or when the resulting segment is flat enough.
subdivideCubic
private void subdivideCubic()
- Repeatedly subdivides the cubic curve segment that is on top
of the stack. The iteration terminates when the recursion limit
has been reached, or when the resulting segment is flat enough.
|
|||||||||
| Home >> All >> java >> awt >> [ geom overview ] | PREV CLASS NEXT CLASS | ||||||||
SUMMARY: JAVADOC | SOURCE | DOWNLOAD | NESTED | FIELD | CONSTR | METHOD |
DETAIL: FIELD | CONSTR | METHOD | ||||||||
JAVADOC
java.awt.geom.FlatteningPathIterator