JHotDraw 7.2

org.jhotdraw.geom
Class BezierPath

java.lang.Object
  extended by java.util.AbstractCollection<E>
      extended by java.util.AbstractList<E>
          extended by java.util.ArrayList<BezierPath.Node>
              extended by org.jhotdraw.geom.BezierPath
All Implemented Interfaces:
java.awt.Shape, java.io.Serializable, java.lang.Cloneable, java.lang.Iterable<BezierPath.Node>, java.util.Collection<BezierPath.Node>, java.util.List<BezierPath.Node>, java.util.RandomAccess

public class BezierPath
extends java.util.ArrayList<BezierPath.Node>
implements java.awt.Shape, java.io.Serializable

BezierPath allows the construction of paths consisting of straight lines, quadratic curves and cubic curves.

A BezierPath represents a geometric path constructed by vertices. Each Node has three control points: C0, C1, C2. A mask defines which control points are in use. The path passes through C0. C1 controls the curve going towards C0. C2 controls the curve going away from C0.

Version:
1.4 2008-05-23 Method findSegment uses now double precision for the tolerance paremeters.
1.3 BezierPath has now its own BezierPathIterator.
1.2.1 Issue #1628647: Method splitSegment created incorrect control point masks.
1.2 2006-12-09 Method setWindingRule added.
1.1 2006-03-22 Methods moveTo, lineTo and quadTo added.
1.0 January 20, 2006 Created.
Author:
Werner Randelshofer
See Also:
Serialized Form

Nested Class Summary
static class BezierPath.Node
          Defines a vertex (node) of the bezier path.
 
Field Summary
static int C0_MASK
          Constant for having only control point C0 in effect.
static int C1_MASK
          Constant for having control point C1 in effect (in addition to C0).
static int C1C2_MASK
          Constant for having control points C1 and C2 in effect (in addition to C0).
static int C2_MASK
          Constant for having control point C2 in effect (in addition to C0).
 
Fields inherited from class java.util.AbstractList
modCount
 
Constructor Summary
BezierPath()
          Creates a new instance.
 
Method Summary
 void add(int mask, java.awt.geom.Point2D.Double c0, java.awt.geom.Point2D.Double c1, java.awt.geom.Point2D.Double c2)
          Convenience method for adding a control point with three coordinates C0, C1 and C2 with a mask.
 void add(java.awt.geom.Point2D.Double c0)
          Convenience method for adding a control point with a single coordinate C0.
 void addAll(java.util.Collection<java.awt.geom.Point2D.Double> points)
          Convenience method for adding multiple control points with a single coordinate C0.
 void addPoint(double x, double y)
           
 void arcTo(double rx, double ry, double xAxisRotation, boolean largeArcFlag, boolean sweepFlag, double x, double y)
          Adds an elliptical arc, defined by two radii, an angle from the x-axis, a flag to choose the large arc or not, a flag to indicate if we increase or decrease the angles and the final point of the arc.
 java.awt.geom.Point2D.Double chop(java.awt.geom.Point2D.Double p)
          Returns a point on the edge of the bezier path which crosses the line from the center of the bezier path to the specified point.
 BezierPath clone()
          Creates a deep copy of the BezierPath.
 boolean contains(double x, double y)
           
 boolean contains(double x, double y, double w, double h)
           
 boolean contains(java.awt.geom.Point2D p)
           
 boolean contains(java.awt.geom.Rectangle2D r)
           
 void curveTo(double x1, double y1, double x2, double y2, double x3, double y3)
           
 int findSegment(java.awt.geom.Point2D.Double find, double tolerance)
          Gets the segment of the polyline that is hit by the given Point2D.Double.
 java.awt.geom.Point2D.Double get(int index, int coord)
          Convenience method for getting a single coordinate of a control point.
 java.awt.Rectangle getBounds()
           
 java.awt.geom.Rectangle2D.Double getBounds2D()
           
 java.awt.geom.Point2D.Double getCenter()
          Returns the point at the center of the bezier path.
 double getLengthOfPath(double flatness)
          Returns the length of the path.
 java.awt.geom.PathIterator getPathIterator(java.awt.geom.AffineTransform at)
           
 java.awt.geom.PathIterator getPathIterator(java.awt.geom.AffineTransform at, double flatness)
           
 java.awt.geom.Point2D.Double getPointOnPath(double relative, double flatness)
          Returns a relative point on the path.
 double getRelativePositionOnPath(java.awt.geom.Point2D.Double find, double flatness)
          Returns the relative position of the specified point on the path.
 int getWindingRule()
          Gets winding rule for filling the bezier path.
 int indexOfOutermostNode()
          Return the index of the control point that is furthest from the center
 boolean intersects(double x, double y, double w, double h)
           
 boolean intersects(java.awt.geom.Rectangle2D r)
           
 void invalidatePath()
          This must be called after the BezierPath has been changed.
 boolean isClosed()
           
 int joinSegments(java.awt.geom.Point2D.Double join, double tolerance)
          Joins two segments into one if the given Point2D.Double hits a node of the bezier path.
 void lineTo(double x1, double y1)
           
 void moveTo(double x1, double y1)
           
 boolean outlineContains(java.awt.geom.Point2D.Double p, double tolerance)
          Returns true, if the outline of this bezier path contains the specified point.
 void quadTo(double x1, double y1, double x2, double y2)
           
 void set(int index, int coord, java.awt.geom.Point2D.Double p)
          Convenience method for changing a single coordinate of a control point.
 void setClosed(boolean newValue)
           
 void setTo(BezierPath that)
           
 void setWindingRule(int newValue)
          Sets winding rule for filling the bezier path.
 int splitSegment(java.awt.geom.Point2D.Double split, double tolerance)
          Splits the segment at the given Point2D.Double if a segment was hit.
 java.awt.geom.GeneralPath toGeneralPath()
          Converts the BezierPath into a GeneralPath.
 java.awt.geom.Point2D.Double[] toPolygonArray()
          Creates a polygon array of the bezier path.
 void transform(java.awt.geom.AffineTransform tx)
          Transforms the BezierPath.
 void validatePath()
          Recomputes the BezierPath, if it is invalid.
 
Methods inherited from class java.util.ArrayList
add, add, addAll, addAll, clear, contains, ensureCapacity, get, indexOf, isEmpty, lastIndexOf, remove, remove, removeRange, set, size, toArray, toArray, trimToSize
 
Methods inherited from class java.util.AbstractList
equals, hashCode, iterator, listIterator, listIterator, subList
 
Methods inherited from class java.util.AbstractCollection
containsAll, removeAll, retainAll, toString
 
Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface java.util.List
containsAll, equals, hashCode, iterator, listIterator, listIterator, removeAll, retainAll, subList
 

Field Detail

C0_MASK

public static final int C0_MASK
Constant for having only control point C0 in effect. C0 is the point through whitch the curve passes.

See Also:
Constant Field Values

C1_MASK

public static final int C1_MASK
Constant for having control point C1 in effect (in addition to C0). C1 controls the curve going towards C0.

See Also:
Constant Field Values

C2_MASK

public static final int C2_MASK
Constant for having control point C2 in effect (in addition to C0). C2 controls the curve going away from C0.

See Also:
Constant Field Values

C1C2_MASK

public static final int C1C2_MASK
Constant for having control points C1 and C2 in effect (in addition to C0).

See Also:
Constant Field Values
Constructor Detail

BezierPath

public BezierPath()
Creates a new instance.

Method Detail

add

public void add(java.awt.geom.Point2D.Double c0)
Convenience method for adding a control point with a single coordinate C0.


addPoint

public void addPoint(double x,
                     double y)

add

public void add(int mask,
                java.awt.geom.Point2D.Double c0,
                java.awt.geom.Point2D.Double c1,
                java.awt.geom.Point2D.Double c2)
Convenience method for adding a control point with three coordinates C0, C1 and C2 with a mask.


addAll

public void addAll(java.util.Collection<java.awt.geom.Point2D.Double> points)
Convenience method for adding multiple control points with a single coordinate C0.


set

public void set(int index,
                int coord,
                java.awt.geom.Point2D.Double p)
Convenience method for changing a single coordinate of a control point.


get

public java.awt.geom.Point2D.Double get(int index,
                                        int coord)
Convenience method for getting a single coordinate of a control point.


invalidatePath

public void invalidatePath()
This must be called after the BezierPath has been changed.


validatePath

public void validatePath()
Recomputes the BezierPath, if it is invalid.


toGeneralPath

public java.awt.geom.GeneralPath toGeneralPath()
Converts the BezierPath into a GeneralPath.


contains

public boolean contains(java.awt.geom.Point2D p)
Specified by:
contains in interface java.awt.Shape

outlineContains

public boolean outlineContains(java.awt.geom.Point2D.Double p,
                               double tolerance)
Returns true, if the outline of this bezier path contains the specified point.

Parameters:
p - The point to be tested.
tolerance - The tolerance for the test.

intersects

public boolean intersects(java.awt.geom.Rectangle2D r)
Specified by:
intersects in interface java.awt.Shape

getPathIterator

public java.awt.geom.PathIterator getPathIterator(java.awt.geom.AffineTransform at)
Specified by:
getPathIterator in interface java.awt.Shape

getPathIterator

public java.awt.geom.PathIterator getPathIterator(java.awt.geom.AffineTransform at,
                                                  double flatness)
Specified by:
getPathIterator in interface java.awt.Shape

contains

public boolean contains(java.awt.geom.Rectangle2D r)
Specified by:
contains in interface java.awt.Shape

intersects

public boolean intersects(double x,
                          double y,
                          double w,
                          double h)
Specified by:
intersects in interface java.awt.Shape

getBounds2D

public java.awt.geom.Rectangle2D.Double getBounds2D()
Specified by:
getBounds2D in interface java.awt.Shape

getBounds

public java.awt.Rectangle getBounds()
Specified by:
getBounds in interface java.awt.Shape

contains

public boolean contains(double x,
                        double y,
                        double w,
                        double h)
Specified by:
contains in interface java.awt.Shape

contains

public boolean contains(double x,
                        double y)
Specified by:
contains in interface java.awt.Shape

setClosed

public void setClosed(boolean newValue)

isClosed

public boolean isClosed()

clone

public BezierPath clone()
Creates a deep copy of the BezierPath.

Overrides:
clone in class java.util.ArrayList<BezierPath.Node>

transform

public void transform(java.awt.geom.AffineTransform tx)
Transforms the BezierPath.

Parameters:
tx - the transformation.

setTo

public void setTo(BezierPath that)

getCenter

public java.awt.geom.Point2D.Double getCenter()
Returns the point at the center of the bezier path.


chop

public java.awt.geom.Point2D.Double chop(java.awt.geom.Point2D.Double p)
Returns a point on the edge of the bezier path which crosses the line from the center of the bezier path to the specified point. If no edge crosses the line, the nearest C0 control point is returned.


indexOfOutermostNode

public int indexOfOutermostNode()
Return the index of the control point that is furthest from the center


getPointOnPath

public java.awt.geom.Point2D.Double getPointOnPath(double relative,
                                                   double flatness)
Returns a relative point on the path. Where 0 is the start point of the path and 1 is the end point of the path.

Parameters:
relative - a value between 0 and 1.

getLengthOfPath

public double getLengthOfPath(double flatness)
Returns the length of the path.

Parameters:
flatness - the flatness used to approximate the length.

getRelativePositionOnPath

public double getRelativePositionOnPath(java.awt.geom.Point2D.Double find,
                                        double flatness)
Returns the relative position of the specified point on the path.

Parameters:
flatness - the flatness used to approximate the length.
Returns:
relative position on path, this is a number between 0 and 1. Returns -1, if the point is not on the path.

findSegment

public int findSegment(java.awt.geom.Point2D.Double find,
                       double tolerance)
Gets the segment of the polyline that is hit by the given Point2D.Double.

Returns:
the index of the segment or -1 if no segment was hit.

joinSegments

public int joinSegments(java.awt.geom.Point2D.Double join,
                        double tolerance)
Joins two segments into one if the given Point2D.Double hits a node of the bezier path.

Returns:
the index of the joined segment or -1 if no segment was joined.

splitSegment

public int splitSegment(java.awt.geom.Point2D.Double split,
                        double tolerance)
Splits the segment at the given Point2D.Double if a segment was hit.

Returns:
the index of the segment or -1 if no segment was hit.

moveTo

public void moveTo(double x1,
                   double y1)

lineTo

public void lineTo(double x1,
                   double y1)

quadTo

public void quadTo(double x1,
                   double y1,
                   double x2,
                   double y2)

curveTo

public void curveTo(double x1,
                    double y1,
                    double x2,
                    double y2,
                    double x3,
                    double y3)

arcTo

public void arcTo(double rx,
                  double ry,
                  double xAxisRotation,
                  boolean largeArcFlag,
                  boolean sweepFlag,
                  double x,
                  double y)
Adds an elliptical arc, defined by two radii, an angle from the x-axis, a flag to choose the large arc or not, a flag to indicate if we increase or decrease the angles and the final point of the arc.

As specified in http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands

The implementation of this method has been derived from Apache Batik class org.apache.batik.ext.awt.geom.ExtendedGeneralPath#computArc

Parameters:
rx - the x radius of the ellipse
ry - the y radius of the ellipse
xAxisRotation - the angle from the x-axis of the current coordinate system to the x-axis of the ellipse in degrees.
largeArcFlag - the large arc flag. If true the arc spanning less than or equal to 180 degrees is chosen, otherwise the arc spanning greater than 180 degrees is chosen
sweepFlag - the sweep flag. If true the line joining center to arc sweeps through decreasing angles otherwise it sweeps through increasing angles
x - the absolute x coordinate of the final point of the arc.
y - the absolute y coordinate of the final point of the arc.

toPolygonArray

public java.awt.geom.Point2D.Double[] toPolygonArray()
Creates a polygon array of the bezier path.

Returns:
Point array.

setWindingRule

public void setWindingRule(int newValue)
Sets winding rule for filling the bezier path.

Parameters:
newValue - Must be GeneralPath.WIND_EVEN_ODD or GeneralPath.WIND_NON_ZERO.

getWindingRule

public int getWindingRule()
Gets winding rule for filling the bezier path.

Returns:
GeneralPath.WIND_EVEN_ODD or GeneralPath.WIND_NON_ZERO.

Copyright 1996-2009 (c) by the authors and contributors of the JHotDraw project.
Some rights reserved.