java.awt.geom
Class FlatteningPathIterator

java.lang.Object
  extended by java.awt.geom.FlatteningPathIterator
All Implemented Interfaces:
PathIterator

public class FlatteningPathIterator
extends Object
implements PathIterator

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, PathIterator.SEG_LINETO, and PathIterator.SEG_CLOSE.

The accuracy of the approximation is determined by two parameters:

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
See Also:
Implementation Note

Field Summary
 
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.
 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.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

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_QUADTO or SEG_CUBICTO segment 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.

See Also:
QuadCurve2D.getFlatness(), CubicCurve2D.getFlatness()

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:
getWindingRule in interface PathIterator
Returns:
the winding rule
See Also:
PathIterator.WIND_EVEN_ODD, PathIterator.WIND_NON_ZERO

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:
isDone in interface PathIterator
Returns:
true if the iteration is complete

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:
next in interface PathIterator

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:
currentSegment in interface PathIterator
Parameters:
coords - the array to place the point coordinates in
Returns:
the segment type
See Also:
PathIterator.SEG_MOVETO, PathIterator.SEG_LINETO, PathIterator.SEG_QUADTO, PathIterator.SEG_CUBICTO, PathIterator.SEG_CLOSE

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:
currentSegment in interface PathIterator
Parameters:
coords - the array to place the point coordinates in
Returns:
the segment type
See Also:
PathIterator.SEG_MOVETO, PathIterator.SEG_LINETO, PathIterator.SEG_QUADTO, PathIterator.SEG_CUBICTO, PathIterator.SEG_CLOSE