java.awt.geom
Class GeneralPath

java.lang.Object
  extended by java.awt.geom.GeneralPath
All Implemented Interfaces:
Shape, Cloneable

public final class GeneralPath
extends Object
implements Shape, Cloneable

A general geometric path, consisting of any number of subpaths constructed out of straight lines and cubic or quadratic Bezier curves.

The inside of the curve is defined for drawing purposes by a winding rule. Either the WIND_EVEN_ODD or WIND_NON_ZERO winding rule can be chosen.

A drawing of a GeneralPath

The EVEN_ODD winding rule defines a point as inside a path if: A ray from the point towards infinity in an arbitrary direction intersects the path an odd number of times. Points A and C in the image are considered to be outside the path. (both intersect twice) Point B intersects once, and is inside.

The NON_ZERO winding rule defines a point as inside a path if: The path intersects the ray in an equal number of opposite directions. Point A in the image is outside (one intersection in the ’up’ direction, one in the ’down’ direction) Point B in the image is inside (one intersection ’down’) Point C in the image is inside (two intersections in the ’down’ direction)

Since:
1.2
See Also:
Line2D, CubicCurve2D, QuadCurve2D

Field Summary
static int WIND_EVEN_ODD
          Same constant as PathIterator.WIND_EVEN_ODD.
static int WIND_NON_ZERO
          Same constant as PathIterator.WIND_NON_ZERO.
 
Constructor Summary
GeneralPath()
          Constructs a GeneralPath with the default (NON_ZERO) winding rule and initial capacity (20).
GeneralPath(int rule)
          Constructs a GeneralPath with a specific winding rule and the default initial capacity (20).
GeneralPath(int rule, int capacity)
          Constructs a GeneralPath with a specific winding rule and the initial capacity.
GeneralPath(Shape s)
          Constructs a GeneralPath from an arbitrary shape object.
 
Method Summary
 void append(PathIterator iter, boolean connect)
          Appends the segments of a PathIterator to this GeneralPath.
 void append(Shape s, boolean connect)
          Appends the segments of a Shape to the path.
 Object clone()
          Creates a new shape of the same run-time type with the same contents as this one.
 void closePath()
          Closes the current subpath by drawing a line back to the point of the last moveTo, unless the path is already closed.
 boolean contains(double x, double y)
          Evaluates if a point is within the GeneralPath, The NON_ZERO winding rule is used, regardless of the set winding rule.
 boolean contains(double x, double y, double w, double h)
          Evaluates if a rectangle is completely contained within the path.
 boolean contains(Point2D p)
          Evaluates if a Point2D is within the GeneralPath, The NON_ZERO winding rule is used, regardless of the set winding rule.
 boolean contains(Rectangle2D r)
          Evaluates if a rectangle is completely contained within the path.
 Shape createTransformedShape(AffineTransform xform)
          Creates a transformed version of the path.
 void curveTo(float x1, float y1, float x2, float y2, float x3, float y3)
          Appends a cubic Bezier curve to the current path.
 Rectangle getBounds()
          Returns the path’s bounding box.
 Rectangle2D getBounds2D()
          Returns the path’s bounding box, in float precision
 Point2D getCurrentPoint()
          Returns the current appending point of the path.
 PathIterator getPathIterator(AffineTransform at)
          Creates a PathIterator for iterating along the segments of the path.
 PathIterator getPathIterator(AffineTransform at, double flatness)
          Creates a new FlatteningPathIterator for the path
 int getWindingRule()
          Returns the path’s current winding rule.
 boolean intersects(double x, double y, double w, double h)
          Evaluates if a rectangle intersects the path.
 boolean intersects(Rectangle2D r)
          Evaluates if a Rectangle2D intersects the path.
 void lineTo(float x, float y)
          Appends a straight line to the current path.
 void moveTo(float x, float y)
          Adds a new point to a path.
 void quadTo(float x1, float y1, float x2, float y2)
          Appends a quadratic Bezier curve to the current path.
 void reset()
          Resets the path.
 void setWindingRule(int rule)
          Sets the path’s winding rule, which controls which areas are considered ’inside’ or ’outside’ the path on drawing.
 void transform(AffineTransform xform)
          Applies a transform to the path.
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

WIND_EVEN_ODD

public static final int WIND_EVEN_ODD
Same constant as PathIterator.WIND_EVEN_ODD.

See Also:
Constant Field Values

WIND_NON_ZERO

public static final int WIND_NON_ZERO
Same constant as PathIterator.WIND_NON_ZERO.

See Also:
Constant Field Values
Constructor Detail

GeneralPath

public GeneralPath()
Constructs a GeneralPath with the default (NON_ZERO) winding rule and initial capacity (20).


GeneralPath

public GeneralPath(int rule)
Constructs a GeneralPath with a specific winding rule and the default initial capacity (20).

Parameters:
rule - the winding rule (WIND_NON_ZERO or WIND_EVEN_ODD)
Throws:
IllegalArgumentException - if rule is not one of the listed values.

GeneralPath

public GeneralPath(int rule,
                   int capacity)
Constructs a GeneralPath with a specific winding rule and the initial capacity. The initial capacity should be the approximate number of path segments to be used.

Parameters:
rule - the winding rule (WIND_NON_ZERO or WIND_EVEN_ODD)
capacity - the inital capacity, in path segments
Throws:
IllegalArgumentException - if rule is not one of the listed values.

GeneralPath

public GeneralPath(Shape s)
Constructs a GeneralPath from an arbitrary shape object. The Shapes PathIterator path and winding rule will be used.

Parameters:
s - the shape (null not permitted).
Throws:
NullPointerException - if shape is null.
Method Detail

moveTo

public void moveTo(float x,
                   float y)
Adds a new point to a path.

Parameters:
x - the x-coordinate.
y - the y-coordinate.

lineTo

public void lineTo(float x,
                   float y)
Appends a straight line to the current path.

Parameters:
x - x coordinate of the line endpoint.
y - y coordinate of the line endpoint.

quadTo

public void quadTo(float x1,
                   float y1,
                   float x2,
                   float y2)
Appends a quadratic Bezier curve to the current path.

Parameters:
x1 - x coordinate of the control point
y1 - y coordinate of the control point
x2 - x coordinate of the curve endpoint.
y2 - y coordinate of the curve endpoint.

curveTo

public void curveTo(float x1,
                    float y1,
                    float x2,
                    float y2,
                    float x3,
                    float y3)
Appends a cubic Bezier curve to the current path.

Parameters:
x1 - x coordinate of the first control point
y1 - y coordinate of the first control point
x2 - x coordinate of the second control point
y2 - y coordinate of the second control point
x3 - x coordinate of the curve endpoint.
y3 - y coordinate of the curve endpoint.

closePath

public void closePath()
Closes the current subpath by drawing a line back to the point of the last moveTo, unless the path is already closed.


append

public void append(Shape s,
                   boolean connect)
Appends the segments of a Shape to the path. If connect is true, the new path segments are connected to the existing one with a line. The winding rule of the Shape is ignored.

Parameters:
s - the shape (null not permitted).
connect - whether to connect the new shape to the existing path.
Throws:
NullPointerException - if s is null.

append

public void append(PathIterator iter,
                   boolean connect)
Appends the segments of a PathIterator to this GeneralPath. Optionally, the initial PathIterator.SEG_MOVETO segment of the appended path is changed into a PathIterator.SEG_LINETO segment.

Parameters:
iter - the PathIterator specifying which segments shall be appended (null not permitted).
connect - true for substituting the initial PathIterator.SEG_MOVETO segment by a PathIterator.SEG_LINETO, or false for not performing any substitution. If this GeneralPath is currently empty, connect is assumed to be false, thus leaving the initial PathIterator.SEG_MOVETO unchanged.

getWindingRule

public int getWindingRule()
Returns the path’s current winding rule.

Returns:
WIND_EVEN_ODD or WIND_NON_ZERO.

setWindingRule

public void setWindingRule(int rule)
Sets the path’s winding rule, which controls which areas are considered ’inside’ or ’outside’ the path on drawing. Valid rules are WIND_EVEN_ODD for an even-odd winding rule, or WIND_NON_ZERO for a non-zero winding rule.

Parameters:
rule - the rule (WIND_EVEN_ODD or WIND_NON_ZERO).

getCurrentPoint

public Point2D getCurrentPoint()
Returns the current appending point of the path.

Returns:
The point.

reset

public void reset()
Resets the path. All points and segments are destroyed.


transform

public void transform(AffineTransform xform)
Applies a transform to the path.

Parameters:
xform - the transform (null not permitted).

createTransformedShape

public Shape createTransformedShape(AffineTransform xform)
Creates a transformed version of the path.

Parameters:
xform - the transform to apply
Returns:
a new transformed GeneralPath

getBounds

public Rectangle getBounds()
Returns the path’s bounding box.

Specified by:
getBounds in interface Shape
Returns:
the shape's bounding box
See Also:
Shape.getBounds2D()

getBounds2D

public Rectangle2D getBounds2D()
Returns the path’s bounding box, in float precision

Specified by:
getBounds2D in interface Shape
Returns:
the shape's bounding box
See Also:
Shape.getBounds()

contains

public boolean contains(double x,
                        double y)
Evaluates if a point is within the GeneralPath, The NON_ZERO winding rule is used, regardless of the set winding rule.

Specified by:
contains in interface Shape
Parameters:
x - x coordinate of the point to evaluate
y - y coordinate of the point to evaluate
Returns:
true if the point is within the path, false otherwise

contains

public boolean contains(Point2D p)
Evaluates if a Point2D is within the GeneralPath, The NON_ZERO winding rule is used, regardless of the set winding rule.

Specified by:
contains in interface Shape
Parameters:
p - The Point2D to evaluate
Returns:
true if the point is within the path, false otherwise

contains

public boolean contains(double x,
                        double y,
                        double w,
                        double h)
Evaluates if a rectangle is completely contained within the path. This method will return false in the cases when the box intersects an inner segment of the path. (i.e.: The method is accurate for the EVEN_ODD winding rule)

Specified by:
contains in interface Shape
Parameters:
x - the x coordinate of the rectangle
y - the y coordinate of the rectangle
w - the width of the rectangle, undefined results if negative
h - the height of the rectangle, undefined results if negative
Returns:
true if the rectangle is contained in this shape
See Also:
Area

contains

public boolean contains(Rectangle2D r)
Evaluates if a rectangle is completely contained within the path. This method will return false in the cases when the box intersects an inner segment of the path. (i.e.: The method is accurate for the EVEN_ODD winding rule)

Specified by:
contains in interface Shape
Parameters:
r - the rectangle
Returns:
true if the rectangle is completely contained within the path, false otherwise
See Also:
Shape.contains(double, double, double, double)

intersects

public boolean intersects(double x,
                          double y,
                          double w,
                          double h)
Evaluates if a rectangle intersects the path.

Specified by:
intersects in interface Shape
Parameters:
x - x coordinate of the rectangle
y - y coordinate of the rectangle
w - width of the rectangle
h - height of the rectangle
Returns:
true if the rectangle intersects the path, false otherwise
See Also:
Area

intersects

public boolean intersects(Rectangle2D r)
Evaluates if a Rectangle2D intersects the path.

Specified by:
intersects in interface Shape
Parameters:
r - The rectangle
Returns:
true if the rectangle intersects the path, false otherwise
See Also:
Shape.intersects(double, double, double, double)

getPathIterator

public PathIterator getPathIterator(AffineTransform at)
Creates a PathIterator for iterating along the segments of the path.

Specified by:
getPathIterator in interface Shape
Parameters:
at - an affine transformation for projecting the returned points, or null to let the created iterator return the original points without any mapping.
Returns:
a new iterator over the boundary

getPathIterator

public PathIterator getPathIterator(AffineTransform at,
                                    double flatness)
Creates a new FlatteningPathIterator for the path

Specified by:
getPathIterator in interface Shape
Parameters:
at - an optional transform to apply to the iterator (null permitted).
flatness - the maximum distance for deviation from the real boundary
Returns:
a new iterator over the boundary

clone

public Object clone()
Creates a new shape of the same run-time type with the same contents as this one.

Overrides:
clone in class Object
Returns:
the clone
Throws:
OutOfMemoryError - If there is not enough memory available.
Since:
1.2
See Also:
Cloneable