# Interface PathIterator

Known Implementing Classes:
FlatteningPathIterator

`public interface PathIterator`

This interface provides a directed path over the boundary of a shape. The path can contain 1st through 3rd order Bezier curves (lines, and quadratic and cubic splines). A shape can have multiple disjoint paths via the MOVETO directive, and can close a circular path back to the previos MOVETO via the CLOSE directive.
Since:
1.2
`Shape`, `Stroke`, `FlatteningPathIterator`

## Field Summary

`static int`
`SEG_CLOSE`
The current segment closes a loop by an implicit line to the previous SEG_MOVETO coordinate.
`static int`
`SEG_CUBICTO`
The current segment is a cubic parametric curve (more commonly known as a Bezier curve).
`static int`
`SEG_LINETO`
The current segment is a line.
`static int`
`SEG_MOVETO`
Starts a new subpath.
`static int`
`SEG_QUADTO`
The current segment is a quadratic parametric curve.
`static int`
`WIND_EVEN_ODD`
The even-odd winding mode: a point is internal to the shape if a ray from the point to infinity (in any direction) crosses an odd number of segments.
`static int`
`WIND_NON_ZERO`
The non-zero winding mode: a point is internal to the shape if a ray from the point to infinity (in any direction) crosses a different number of segments headed clockwise than those headed counterclockwise.

## 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.
` 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.

## Field Details

### SEG_CLOSE

`public static final int SEG_CLOSE`
The current segment closes a loop by an implicit line to the previous SEG_MOVETO coordinate.
Field Value:
4

### SEG_CUBICTO

`public static final int SEG_CUBICTO`
The current segment is a cubic parametric curve (more commonly known as a Bezier curve). It is interpolated as t varies from 0 to 1 over the current point (CP), first control point (P1), the second control point (P2), and final interpolated control point (P3):
```  P(t) = B(3,0)*CP + B(3,1)*P1 + B(3,2)*P2 + B(3,3)*P3
0 <= t <= 1
B(n,m) = mth coefficient of nth degree Bernstein polynomial
= C(n,m) * t^(m) * (1 - t)^(n-m)
C(n,m) = Combinations of n things, taken m at a time
= n! / (m! * (n-m)!)
```
Field Value:
3

### SEG_LINETO

`public static final int SEG_LINETO`
The current segment is a line.
Field Value:
1

### SEG_MOVETO

`public static final int SEG_MOVETO`
Starts a new subpath. There is no segment from the previous vertex.
Field Value:
0

`public static final int SEG_QUADTO`
The current segment is a quadratic parametric curve. It is interpolated as t varies from 0 to 1 over the current point (CP), first control point (P1), and final interpolated control point (P2):
```  P(t) = B(2,0)*CP + B(2,1)*P1 + B(2,2)*P2
0 <= t <= 1
B(n,m) = mth coefficient of nth degree Bernstein polynomial
= C(n,m) * t^(m) * (1 - t)^(n-m)
C(n,m) = Combinations of n things, taken m at a time
= n! / (m! * (n-m)!)
```
Field Value:
2

### WIND_EVEN_ODD

`public static final int WIND_EVEN_ODD`
The even-odd winding mode: a point is internal to the shape if a ray from the point to infinity (in any direction) crosses an odd number of segments.
Field Value:
0

### WIND_NON_ZERO

`public static final int WIND_NON_ZERO`
The non-zero winding mode: a point is internal to the shape if a ray from the point to infinity (in any direction) crosses a different number of segments headed clockwise than those headed counterclockwise.
Field Value:
1

## Method Details

### currentSegment

`public int currentSegment(double[] coords)`
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, 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). 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.
Parameters:
`coords` - the array to place the point coordinates in
Returns:
the segment type
Throws:
`NullPointerException` - if coords is null
`ArrayIndexOutOfBoundsException` - if coords is too small
`NoSuchElementException` - optional when isDone() is true

### currentSegment

`public int currentSegment(float[] coords)`
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, 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). 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.
Parameters:
`coords` - the array to place the point coordinates in
Returns:
the segment type
Throws:
`NullPointerException` - if coords is null
`ArrayIndexOutOfBoundsException` - if coords is too small
`NoSuchElementException` - optional when isDone() is true

### getWindingRule

`public int getWindingRule()`
Returns the winding rule to determine which points are inside this path.
Returns:
the winding rule

### isDone

`public boolean isDone()`
Tests if the iterator is exhausted. If this returns true, currentSegment and next may throw a NoSuchElementException (although this is not required).
Returns:
true if the iteration is complete

### next

`public void next()`
Advance to the next segment in the iteration. It is not specified what this does if called when isDone() returns true.
Throws:
`NoSuchElementException` - optional when isDone() is true