Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

java.awt.geom
Class FlatteningPathIterator  view FlatteningPathIterator download FlatteningPathIterator.java

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

public class FlatteningPathIterator
extends java.lang.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 55 , PathIterator.SEG_LINETO 55 , and PathIterator.SEG_CLOSE 55 .

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

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_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.


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

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

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

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

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.