math.geom2d.spline
Class CubicBezierCurve2D

java.lang.Object
  extended by math.geom2d.curve.AbstractContinuousCurve2D
      extended by math.geom2d.curve.AbstractSmoothCurve2D
          extended by math.geom2d.spline.CubicBezierCurve2D
All Implemented Interfaces:
java.lang.Cloneable, ContinuousCurve2D, Curve2D, SmoothCurve2D, ContinuousOrientedCurve2D, OrientedCurve2D, GeometricObject2D, Shape2D

public class CubicBezierCurve2D
extends AbstractSmoothCurve2D
implements SmoothCurve2D, ContinuousOrientedCurve2D, java.lang.Cloneable

A cubic bezier curve, defined by 4 control points. The curve passes through the first and the last control points. The second and the third control points defines the tangents at the extremities of the curve. From javaGeom 0.8.0, this shape does not extends java.awt.geom.CubicCurve2D.Double anymore

Author:
Legland

Field Summary
 
Fields inherited from interface math.geom2d.Shape2D
ACCURACY
 
Constructor Summary
CubicBezierCurve2D()
           
CubicBezierCurve2D(double[][] coefs)
          Build a new Bezier curve from its array of coefficients.
CubicBezierCurve2D(double x1, double y1, double xctrl1, double yctrl1, double xctrl2, double yctrl2, double x2, double y2)
          Build a new Bezier curve of degree 3 by specifying position of extreme points and position of 2 control points.
CubicBezierCurve2D(Point2D p1, Point2D ctrl1, Point2D ctrl2, Point2D p2)
          Build a new Bezier curve of degree 3 by specifying position of extreme points and position of 2 control points.
CubicBezierCurve2D(Point2D p1, Vector2D v1, Point2D p2, Vector2D v2)
          Build a new Bezier curve of degree 3 by specifying position and tangent of first and last points.
 
Method Summary
 boolean almostEquals(GeometricObject2D obj, double eps)
          Checks if the two objects are similar up to a given threshold value.
 java.awt.geom.GeneralPath appendPath(java.awt.geom.GeneralPath path)
          Append the path of the curve to the given path.
 Polyline2D asPolyline(int n)
          Converts this continuous curve to an instance of LinearCurve2D with the given number of edges.
 Box2D boundingBox()
          Returns the approximate bounding box of this curve.
 CurveSet2D<? extends CubicBezierCurve2D> clip(Box2D box)
          Clip the Bezier curve by a box.
 CubicBezierCurve2D clone()
          Overrides Object declaration to ensure Curve2D implementation are cloned as Curve2D.
 boolean contains(double x, double y)
          Checks if the shape contains the planar point defined by (x,y).
 boolean contains(Point2D p)
          Checks if the shape contains the given point.
static CubicBezierCurve2D create(Point2D p1, Point2D c1, Point2D c2, Point2D p2)
          Deprecated. since 0.11.1
static CubicBezierCurve2D create(Point2D p1, Vector2D v1, Point2D p2, Vector2D v2)
          Deprecated. since 0.11.1
 double curvature(double t)
          Returns the curvature of the Curve.
 double distance(double x, double y)
          Compute approximated distance, computed on a polyline.
 double distance(Point2D p)
          Returns the distance of the shape to the given point, or the distance of point to the frontier of the shape in the case of a plain shape.
 boolean equals(java.lang.Object obj)
           
 Point2D firstPoint()
          Returns the first point of the curve.
 Point2D getControl1()
           
 Point2D getControl2()
           
 Point2D getCtrlP1()
           
 Point2D getCtrlP2()
           
 java.awt.geom.GeneralPath getGeneralPath()
           
 Point2D getP1()
           
 Point2D getP2()
           
 double[][] getParametric()
          Returns the matrix of parametric representation of the line.
 double getT0()
          Deprecated. replaced by t0() (since 0.11.1).
 double getT1()
          Deprecated. replaced by t1() (since 0.11.1).
 java.util.Collection<Point2D> intersections(LinearShape2D line)
          Use approximation, by replacing Bezier curve with a polyline.
 boolean isBounded()
          Returns true, a cubic Bezier Curve is always bounded.
 boolean isClosed()
          The cubic curve is never closed.
 boolean isEmpty()
          Returns true if the shape does not contain any point.
 boolean isInside(Point2D pt)
          Returns true if the point is 'inside' the domain bounded by the curve.
 Point2D lastPoint()
          Returns the last point of the curve.
 Point2D point(double t)
          Returns the point located at the given position on the curve.
 double position(Point2D point)
          Computes position by approximating cubic spline with a polyline.
 double project(Point2D point)
          Computes position by approximating cubic spline with a polyline.
 CubicBezierCurve2D reverse()
          Returns the Bezier curve given by control points taken in reverse order.
 double signedDistance(double x, double y)
          The same as distanceSigned(Point2D), but by passing 2 double as arguments.
 double signedDistance(Point2D point)
          Returns the signed distance of the curve to the given point.
 CubicBezierCurve2D subCurve(double t0, double t1)
          Computes portion of BezierCurve.
 double t0()
          returns 0, as Bezier curve is parameterized between 0 and 1.
 double t1()
          Returns 1, as Bezier curve is parameterized between 0 and 1.
 Vector2D tangent(double t)
          Returns the tangent of the curve at the given position.
 CubicBezierCurve2D transform(AffineTransform2D trans)
          Returns the Bezier Curve transformed by the given AffineTransform2D.
 double windingAngle(Point2D point)
          Use winding angle of approximated polyline
 
Methods inherited from class math.geom2d.curve.AbstractSmoothCurve2D
isSingular, leftTangent, normal, rightTangent, singularPoints, smoothPieces, vertices
 
Methods inherited from class math.geom2d.curve.AbstractContinuousCurve2D
asAwtShape, continuousCurves, draw
 
Methods inherited from class java.lang.Object
getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface math.geom2d.curve.SmoothCurve2D
normal
 
Methods inherited from interface math.geom2d.curve.ContinuousCurve2D
leftTangent, rightTangent, smoothPieces
 
Methods inherited from interface math.geom2d.curve.Curve2D
asAwtShape, continuousCurves, draw, isSingular, singularPoints, vertices
 

Constructor Detail

CubicBezierCurve2D

public CubicBezierCurve2D()

CubicBezierCurve2D

public CubicBezierCurve2D(double[][] coefs)
Build a new Bezier curve from its array of coefficients. The array must have size 2*4.

Parameters:
coefs - the coefficients of the CubicBezierCurve2D.

CubicBezierCurve2D

public CubicBezierCurve2D(Point2D p1,
                          Point2D ctrl1,
                          Point2D ctrl2,
                          Point2D p2)
Build a new Bezier curve of degree 3 by specifying position of extreme points and position of 2 control points. The resulting curve is totally contained in the convex polygon formed by the 4 control points.

Parameters:
p1 - first point
ctrl1 - first control point
ctrl2 - second control point
p2 - last point

CubicBezierCurve2D

public CubicBezierCurve2D(Point2D p1,
                          Vector2D v1,
                          Point2D p2,
                          Vector2D v2)
Build a new Bezier curve of degree 3 by specifying position and tangent of first and last points.

Parameters:
p1 - first point
v1 - first tangent vector
p2 - position of last point
v2 - last tangent vector

CubicBezierCurve2D

public CubicBezierCurve2D(double x1,
                          double y1,
                          double xctrl1,
                          double yctrl1,
                          double xctrl2,
                          double yctrl2,
                          double x2,
                          double y2)
Build a new Bezier curve of degree 3 by specifying position of extreme points and position of 2 control points. The resulting curve is totally containe in the convex polygon formed by the 4 control points.

Method Detail

create

@Deprecated
public static final CubicBezierCurve2D create(Point2D p1,
                                                         Point2D c1,
                                                         Point2D c2,
                                                         Point2D p2)
Deprecated. since 0.11.1


create

@Deprecated
public static final CubicBezierCurve2D create(Point2D p1,
                                                         Vector2D v1,
                                                         Point2D p2,
                                                         Vector2D v2)
Deprecated. since 0.11.1


getControl1

public Point2D getControl1()

getControl2

public Point2D getControl2()

getP1

public Point2D getP1()

getP2

public Point2D getP2()

getCtrlP1

public Point2D getCtrlP1()

getCtrlP2

public Point2D getCtrlP2()

getParametric

public double[][] getParametric()
Returns the matrix of parametric representation of the line. Result has the form :

[ x0 dx dx2 dx3]

[ y0 dy dy2 dy3]

Coefficients are from the parametric equation : x(t) = x0 + dx*t + dx2*t^2 + dx3*t^3 y(t) = y0 + dy*t + dy2*t^2 + dy3*t^3


windingAngle

public double windingAngle(Point2D point)
Use winding angle of approximated polyline

Specified by:
windingAngle in interface OrientedCurve2D
Parameters:
point - a point of the plane
Returns:
a signed angle
See Also:
OrientedCurve2D.windingAngle(Point2D)

isInside

public boolean isInside(Point2D pt)
Returns true if the point is 'inside' the domain bounded by the curve. Uses a polyline approximation.

Specified by:
isInside in interface OrientedCurve2D
Parameters:
pt - a point in the plane
Returns:
true if the point is on the left side of the curve.

signedDistance

public double signedDistance(Point2D point)
Description copied from interface: OrientedCurve2D
Returns the signed distance of the curve to the given point. The distance is positive if the point lies outside the shape, and negative if the point lies inside the shape. In both cases, absolute value of distance is equals to the distance to the border of the shape.

Specified by:
signedDistance in interface OrientedCurve2D
Parameters:
point - a point of the plane
Returns:
the signed distance to the curve

signedDistance

public double signedDistance(double x,
                             double y)
Description copied from interface: OrientedCurve2D
The same as distanceSigned(Point2D), but by passing 2 double as arguments.

Specified by:
signedDistance in interface OrientedCurve2D
Parameters:
x - x-coord of a point
y - y-coord of a point
Returns:
the signed distance of the point (x,y) to the curve
See Also:
OrientedCurve2D.signedDistance(Point2D)

tangent

public Vector2D tangent(double t)
Description copied from interface: SmoothCurve2D
Returns the tangent of the curve at the given position.

Specified by:
tangent in interface SmoothCurve2D
Parameters:
t - a position on the curve
Returns:
the tangent vector computed for position t
See Also:
SmoothCurve2D.normal(double)

curvature

public double curvature(double t)
Returns the curvature of the Curve.

Specified by:
curvature in interface ContinuousCurve2D
Parameters:
t - the position on the curve
Returns:
the curvature of the curve for position t

isClosed

public boolean isClosed()
The cubic curve is never closed.

Specified by:
isClosed in interface ContinuousCurve2D

asPolyline

public Polyline2D asPolyline(int n)
Description copied from class: AbstractContinuousCurve2D
Converts this continuous curve to an instance of LinearCurve2D with the given number of edges. Returns either an instance of Polyline2D or LinearRing2D, depending on the curve is closed or not. This method can be overridden to return the correct type.

Specified by:
asPolyline in interface ContinuousCurve2D
Overrides:
asPolyline in class AbstractContinuousCurve2D
Parameters:
n - the number of line segments
Returns:
a polyline with n line segments.
See Also:
ContinuousCurve2D.asPolyline(int)

t0

public double t0()
returns 0, as Bezier curve is parameterized between 0 and 1.

Specified by:
t0 in interface Curve2D

getT0

@Deprecated
public double getT0()
Deprecated. replaced by t0() (since 0.11.1).

Specified by:
getT0 in interface Curve2D

t1

public double t1()
Returns 1, as Bezier curve is parameterized between 0 and 1.

Specified by:
t1 in interface Curve2D

getT1

@Deprecated
public double getT1()
Deprecated. replaced by t1() (since 0.11.1).

Specified by:
getT1 in interface Curve2D

intersections

public java.util.Collection<Point2D> intersections(LinearShape2D line)
Use approximation, by replacing Bezier curve with a polyline.

Specified by:
intersections in interface Curve2D
See Also:
Curve2D.intersections(math.geom2d.line.LinearShape2D)

point

public Point2D point(double t)
Description copied from interface: Curve2D
Returns the point located at the given position on the curve. If the parameter lies outside the definition range, the parameter corresponding to the closest bound is used instead. This method can be used to draw an approximated outline of a curve, by selecting multiple values for t and drawing lines between them.

Specified by:
point in interface Curve2D
See Also:
Curve2D.point(double)

firstPoint

public Point2D firstPoint()
Returns the first point of the curve.

Specified by:
firstPoint in interface Curve2D
Overrides:
firstPoint in class AbstractContinuousCurve2D
Returns:
the first point of the curve
See Also:
Curve2D.t0(), Curve2D.point(double)

lastPoint

public Point2D lastPoint()
Returns the last point of the curve.

Specified by:
lastPoint in interface Curve2D
Overrides:
lastPoint in class AbstractContinuousCurve2D
Returns:
the last point of the curve.
See Also:
Curve2D.t1(), Curve2D.point(double)

position

public double position(Point2D point)
Computes position by approximating cubic spline with a polyline.

Specified by:
position in interface Curve2D
Parameters:
point - a point belonging to the curve
Returns:
the position of the point on the curve
See Also:
Curve2D.point(double)

project

public double project(Point2D point)
Computes position by approximating cubic spline with a polyline.

Specified by:
project in interface Curve2D
Parameters:
point - a point to project
Returns:
the position of the closest orthogonal projection

reverse

public CubicBezierCurve2D reverse()
Returns the Bezier curve given by control points taken in reverse order.

Specified by:
reverse in interface ContinuousCurve2D
Specified by:
reverse in interface Curve2D
Specified by:
reverse in interface SmoothCurve2D
Specified by:
reverse in interface ContinuousOrientedCurve2D
Specified by:
reverse in interface OrientedCurve2D

subCurve

public CubicBezierCurve2D subCurve(double t0,
                                   double t1)
Computes portion of BezierCurve. If t1
Specified by:
subCurve in interface ContinuousCurve2D
Specified by:
subCurve in interface Curve2D
Specified by:
subCurve in interface SmoothCurve2D
Specified by:
subCurve in interface ContinuousOrientedCurve2D
Parameters:
t0 - position of the start of the sub-curve
t1 - position of the end of the sub-curve
Returns:
the portion of original curve comprised between t0 and t1.

contains

public boolean contains(double x,
                        double y)
Description copied from interface: Shape2D
Checks if the shape contains the planar point defined by (x,y).

Specified by:
contains in interface Shape2D

contains

public boolean contains(Point2D p)
Description copied from interface: Shape2D
Checks if the shape contains the given point.

Specified by:
contains in interface Shape2D

distance

public double distance(Point2D p)
Description copied from interface: Shape2D
Returns the distance of the shape to the given point, or the distance of point to the frontier of the shape in the case of a plain shape.

Specified by:
distance in interface Shape2D
See Also:
Shape2D.distance(Point2D)

distance

public double distance(double x,
                       double y)
Compute approximated distance, computed on a polyline.

Specified by:
distance in interface Shape2D
See Also:
Shape2D.distance(double, double)

isBounded

public boolean isBounded()
Returns true, a cubic Bezier Curve is always bounded.

Specified by:
isBounded in interface Shape2D

isEmpty

public boolean isEmpty()
Description copied from interface: Shape2D
Returns true if the shape does not contain any point. This is the case for example for PointSet2D without any point.

Specified by:
isEmpty in interface Shape2D
Returns:
true if the shape does not contain any point.

clip

public CurveSet2D<? extends CubicBezierCurve2D> clip(Box2D box)
Clip the Bezier curve by a box. Return a set of CubicBezierCurve2D.

Specified by:
clip in interface ContinuousCurve2D
Specified by:
clip in interface Curve2D
Specified by:
clip in interface SmoothCurve2D
Specified by:
clip in interface ContinuousOrientedCurve2D
Specified by:
clip in interface OrientedCurve2D
Specified by:
clip in interface Shape2D
Parameters:
box - the clipping box
Returns:
the clipped shape

boundingBox

public Box2D boundingBox()
Returns the approximate bounding box of this curve. Actually, computes the bounding box of the set of control points.

Specified by:
boundingBox in interface Shape2D
Returns:
the bounding box of the shape.

transform

public CubicBezierCurve2D transform(AffineTransform2D trans)
Returns the Bezier Curve transformed by the given AffineTransform2D. This is simply done by transforming control points of the curve.

Specified by:
transform in interface ContinuousCurve2D
Specified by:
transform in interface Curve2D
Specified by:
transform in interface SmoothCurve2D
Specified by:
transform in interface ContinuousOrientedCurve2D
Specified by:
transform in interface OrientedCurve2D
Specified by:
transform in interface Shape2D
Parameters:
trans - an affine transform
Returns:
the transformed shape

appendPath

public java.awt.geom.GeneralPath appendPath(java.awt.geom.GeneralPath path)
Description copied from interface: ContinuousCurve2D
Append the path of the curve to the given path.

Specified by:
appendPath in interface ContinuousCurve2D
Parameters:
path - a path to modify
Returns:
the modified path

getGeneralPath

public java.awt.geom.GeneralPath getGeneralPath()

almostEquals

public boolean almostEquals(GeometricObject2D obj,
                            double eps)
Description copied from interface: GeometricObject2D
Checks if the two objects are similar up to a given threshold value. This method can be used to compare the results of geometric computations, that introduce errors due to numerical computations.

Specified by:
almostEquals in interface GeometricObject2D
Parameters:
obj - the object to compare
eps - a threshold value, for example the minimal coordinate difference
Returns:
true if both object have the same value up to the threshold

equals

public boolean equals(java.lang.Object obj)
Overrides:
equals in class java.lang.Object

clone

public CubicBezierCurve2D clone()
Description copied from interface: Curve2D
Overrides Object declaration to ensure Curve2D implementation are cloned as Curve2D.

Specified by:
clone in interface Curve2D
Specified by:
clone in class AbstractSmoothCurve2D
Returns:
the cloned curve