public class BezierPath extends java.util.ArrayList<BezierPath.Node> implements java.awt.Shape, java.io.Serializable, java.lang.Cloneable
A BezierPath is defined by its nodes. Each node has three control points: C0, C1, C2. A mask defines which control points are in use. At a node, the path passes through C0. C1 controls the curve going towards C0. C2 controls the curve going away from C0.
Modifier and Type | Class and Description |
---|---|
static class |
BezierPath.Node
Defines a vertex (node) of the bezier path.
|
Modifier and Type | Field and Description |
---|---|
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).
|
Constructor and Description |
---|
BezierPath()
Creates a new instance.
|
Modifier and Type | Method and Description |
---|---|
void |
add(double x,
double y)
Adds a node to the path.
|
void |
add(int ctrlMask,
java.awt.geom.Point2D.Double c0,
java.awt.geom.Point2D.Double c1,
java.awt.geom.Point2D.Double c2)
Adds a node to the path.
|
void |
add(java.awt.geom.Point2D.Double c0)
Adds a node to the path.
|
void |
addPolyline(java.util.Collection<java.awt.geom.Point2D.Double> points)
Adds a set of nodes to the path.
|
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)
Adds a cubic curve to the bezier path.
|
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 nodeIndex,
int ctrlIndex)
Convenience method for getting a single control point of a node.
|
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 node that is the furthest away 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)
Adds a (at least) linear 'curve' to the bezier path.
|
void |
moveTo(double x1,
double y1)
Adds the first node to the bezier path.
|
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)
Adds a (at least) quadratic curve to the bezier path.
|
void |
set(int nodeIndex,
int ctrlIndex,
java.awt.geom.Point2D.Double p)
Convenience method for changing a single control point of a node.
|
void |
setClosed(boolean newValue) |
void |
setTo(BezierPath that)
Sets all values of this bezier path to that bezier path, so that this
path becomes identical to that path.
|
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.Path2D.Double |
toGeneralPath()
Converts the BezierPath into a Path2D.Double.
|
java.awt.geom.Point2D.Double[] |
toPolygonArray()
Creates a polygon/polyline array of the bezier path which only includes
the C0 control points of the bezier nodes.
|
void |
transform(java.awt.geom.AffineTransform tx)
Transforms the BezierPath.
|
void |
validatePath()
Recomputes the BezierPath, if it is invalid.
|
add, add, addAll, addAll, clear, contains, ensureCapacity, forEach, get, indexOf, isEmpty, iterator, lastIndexOf, listIterator, listIterator, remove, remove, removeAll, removeIf, removeRange, replaceAll, retainAll, set, size, sort, spliterator, subList, toArray, toArray, trimToSize
public static final int C0_MASK
public static final int C1_MASK
public static final int C2_MASK
public static final int C1C2_MASK
public void add(java.awt.geom.Point2D.Double c0)
This is a convenience method for adding a node with a single control point C0 to the path.
public void add(double x, double y)
This is a convenience method for adding a node with a single control point C0 to the path.
public void add(int ctrlMask, java.awt.geom.Point2D.Double c0, java.awt.geom.Point2D.Double c1, java.awt.geom.Point2D.Double c2)
This is a convenience method for adding a node with three control points C0, C1 and C2, and a mask.
ctrlMask
- An or-combination of C0_MASK,C1_MASK and C2_MASK.c0
- The coordinates of the C0 control point.c1
- The coordinates of the C1 control point.c2
- The coordinates of the C2 control point.public void addPolyline(java.util.Collection<java.awt.geom.Point2D.Double> points)
Convenience method for adding multiple nodes with a single control point C0.
public void set(int nodeIndex, int ctrlIndex, java.awt.geom.Point2D.Double p)
nodeIndex
- The index of the node.ctrlIndex
- Either C0_MASK, C1_MASK or C2_MASK.p
- The control point. The coordinates will be cloned.public java.awt.geom.Point2D.Double get(int nodeIndex, int ctrlIndex)
nodeIndex
- The index of the node.ctrlIndex
- Either C0_MASK, C1_MASK or C2_MASK.public void invalidatePath()
public void validatePath()
public java.awt.geom.Path2D.Double toGeneralPath()
public boolean contains(java.awt.geom.Point2D p)
contains
in interface java.awt.Shape
public boolean outlineContains(java.awt.geom.Point2D.Double p, double tolerance)
p
- The point to be tested.tolerance
- The tolerance for the test.public boolean intersects(java.awt.geom.Rectangle2D r)
intersects
in interface java.awt.Shape
public java.awt.geom.PathIterator getPathIterator(java.awt.geom.AffineTransform at)
getPathIterator
in interface java.awt.Shape
public java.awt.geom.PathIterator getPathIterator(java.awt.geom.AffineTransform at, double flatness)
getPathIterator
in interface java.awt.Shape
public boolean contains(java.awt.geom.Rectangle2D r)
contains
in interface java.awt.Shape
public boolean intersects(double x, double y, double w, double h)
intersects
in interface java.awt.Shape
public java.awt.geom.Rectangle2D.Double getBounds2D()
getBounds2D
in interface java.awt.Shape
public java.awt.Rectangle getBounds()
getBounds
in interface java.awt.Shape
public boolean contains(double x, double y, double w, double h)
contains
in interface java.awt.Shape
public boolean contains(double x, double y)
contains
in interface java.awt.Shape
public void setClosed(boolean newValue)
public boolean isClosed()
public BezierPath clone()
clone
in class java.util.ArrayList<BezierPath.Node>
public void transform(java.awt.geom.AffineTransform tx)
tx
- the transformation.public void setTo(BezierPath that)
public java.awt.geom.Point2D.Double getCenter()
public java.awt.geom.Point2D.Double chop(java.awt.geom.Point2D.Double p)
public int indexOfOutermostNode()
public java.awt.geom.Point2D.Double getPointOnPath(double relative, double flatness)
relative
- a value between 0 and 1.public double getLengthOfPath(double flatness)
flatness
- the flatness used to approximate the length.public double getRelativePositionOnPath(java.awt.geom.Point2D.Double find, double flatness)
flatness
- the flatness used to approximate the length.public int findSegment(java.awt.geom.Point2D.Double find, double tolerance)
public int joinSegments(java.awt.geom.Point2D.Double join, double tolerance)
public int splitSegment(java.awt.geom.Point2D.Double split, double tolerance)
public void moveTo(double x1, double y1)
This is a convenience method for adding the first node with a single control point C0 to the bezier path.
public void lineTo(double x1, double y1)
If the previous node has no C2 control point the line will be straight (linear), otherwise the line will be quadratic.
This is a convenience method for adding a node with a single control point C0.
The bezier path must already have at least one node.
public void quadTo(double x1, double y1, double x2, double y2)
If the previous node has no C2 control point the line will be quadratic otherwise the line will be cubic.
This is a convenience method for adding a node with control point C0 and C1 (incoming curve) to the bezier path.
The bezier path must already have at least one node.
public void curveTo(double x1, double y1, double x2, double y2, double x3, double y3)
This is a convenience method for adding a node with control point C0 and C1 (incoming curve) to the bezier path, and also specifying the control point C2 (outgoing curve) of the previous node.
The bezier path must already have at least one node.
public void arcTo(double rx, double ry, double xAxisRotation, boolean largeArcFlag, boolean sweepFlag, double x, double y)
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
rx
- the x radius of the ellipsery
- the y radius of the ellipsexAxisRotation
- 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 chosensweepFlag
- the sweep flag. If true the line joining
center to arc sweeps through decreasing angles otherwise it
sweeps through increasing anglesx
- the absolute x coordinate of the final point of the arc.y
- the absolute y coordinate of the final point of the arc.public java.awt.geom.Point2D.Double[] toPolygonArray()
If the bezier path is closed, the array describes a polygon. If the bezier path is open, the array describes a polyline.
public void setWindingRule(int newValue)
newValue
- Must be Path2D.Double.WIND_EVEN_ODD or Path2D.Double.WIND_NON_ZERO.public int getWindingRule()