# Interface PathIterator

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 `#SEG_MOVETO` directive, and can close a circular path back to the previous `#SEG_MOVETO` via the `#SEG_CLOSE` directive.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static final int`
  `SEG_CLOSE`
  The current segment closes a loop by an implicit line to the previous `#SEG_MOVETO` coordinate.
  `static final int`
  `SEG_CUBICTO`
  The current segment is a cubic parametric curve (more commonly known as a Bezier curve).
  `static final int`
  `SEG_LINETO`
  The current segment is a line.
  `static final int`
  `SEG_MOVETO`
  Starts a new subpath.
  `static final int`
  `SEG_QUADTO`
  The current segment is a quadratic parametric curve.
  `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.
  `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.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `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

  - ### WIND_EVEN_ODD

    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.
    See Also:
      - Constant Field Values

  - ### WIND_NON_ZERO

    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.
    See Also:
      - Constant Field Values

  - ### SEG_MOVETO

    static final int SEG_MOVETO
    Starts a new subpath. There is no segment from the previous vertex.
    See Also:
      - Constant Field Values

  - ### SEG_LINETO

    static final int SEG_LINETO
    The current segment is a line.
    See Also:
      - Constant Field Values

  - ### SEG_QUADTO

    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)!)`

    See Also:
      - Constant Field Values

  - ### SEG_CUBICTO

    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)!)`

    See Also:
      - Constant Field Values

  - ### SEG_CLOSE

    static final int SEG_CLOSE
    The current segment closes a loop by an implicit line to the previous `#SEG_MOVETO` coordinate.
    See Also:
      - Constant Field Values

- ## Method Details

  - ### getWindingRule

    int getWindingRule()

    Returns the winding rule to determine which points are inside this path.

    ###### Returns

    the winding rule. (`#WIND_EVEN_ODD` or `#WIND_NON_ZERO`).

  - ### isDone

    boolean isDone()

    Tests if the iterator is exhausted. If this returns true, currentSegment and next may throw a RuntimeException (although this is not required).

    ###### Returns

    true if the iteration is complete

  - ### next

    void next()
    Advance to the next segment in the iteration. It is not specified what this does if called when `#isDone` returns true.

  - ### currentSegment

    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[6]`, to accommodate 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.

    ###### Parameters

    - `coords`: the array to place the point coordinates in

    ###### Returns

    the segment type. One of (`#SEG_MOVETO`, `#SEG_LINETO`, `#SEG_QUADTO`, `#SEG_CUBICTO`, `#SEG_CLOSE`).

  - ### currentSegment

    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[6]`, to accommodate 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.

    ###### Parameters

    - `coords`: the array to place the point coordinates in

    ###### Returns

    the segment type. One of (`#SEG_MOVETO`, `#SEG_LINETO`, `#SEG_QUADTO`, `#SEG_CUBICTO`, `#SEG_CLOSE`).