A QuadraticSpline2d is a quadratic Bézier curve
in 2D defined by three control points. This module contains functionality for
Construct a spline from its three control points:
exampleSpline =
QuadraticSpline2d.fromControlPoints
( Point2d.fromCoordinates ( 1, 1 )
, Point2d.fromCoordinates ( 3, 4 )
, Point2d.fromCoordinates ( 5, 1 )
)Get the control points of a spline as a tuple.
( p1, p2, p3 ) =
QuadraticSpline2d.controlPoints exampleSpline
--> p1 = Point2d.fromCoordinates ( 1, 1 )
--> p2 = Point2d.fromCoordinates ( 3, 4 )
--> p3 = Point2d.fromCoordinates ( 5, 1 )Get the start point of a spline. This is equal to the spline's first control point.
QuadraticSpline2d.startPoint exampleSpline
--> Point2d.fromCoordinates ( 1, 1 )Get the end point of a spline. This is equal to the spline's last control point.
QuadraticSpline2d.endPoint exampleSpline
--> Point2d.fromCoordinates ( 5, 1 )Get the start derivative of a spline. This is equal to twice the vector from the spline's first control point to its second.
QuadraticSpline2d.startDerivative exampleSpline
--> Vector2d.fromComponents ( 4, 6 )Get the end derivative of a spline. This is equal to twice the vector from the spline's second control point to its third.
QuadraticSpline2d.endDerivative exampleSpline
--> Vector2d.fromComponents ( 4, -6 )Get a point along a spline, based on a parameter that ranges from 0 to 1. A parameter value of 0 corresponds to the start point of the spline and a value of 1 corresponds to the end point.
QuadraticSpline2d.pointOn exampleSpline 0
--> Point2d.fromCoordinates ( 1, 1 )
QuadraticSpline2d.pointOn exampleSpline 0.5
--> Point2d.fromCoordinates ( 3, 2.5 )
QuadraticSpline2d.pointOn exampleSpline 1
--> Point2d.fromCoordinates ( 5, 1 )Get the deriative value at a point along a spline, based on a parameter that ranges from 0 to 1. A parameter value of 0 corresponds to the start derivative of the spline and a value of 1 corresponds to the end derivative.
QuadraticSpline2d.derivative exampleSpline 0
--> Vector2d.fromComponents ( 4, 6 )
QuadraticSpline2d.derivative exampleSpline 0.5
--> Vector2d.fromComponents ( 4, 0 )
QuadraticSpline2d.derivative exampleSpline 1
--> Vector2d.fromComponents ( 4, -6 )Note that the derivative interpolates linearly from end to end.
Evaluate a spline at a given parameter value, returning the point on the spline at that parameter value and the derivative with respect to that parameter value;
QuadraticSpline2d.evaluate spline tis equivalent to
( QuadraticSpline2d.pointOn spline t
, QuadraticSpline2d.derivative spline t
)but is more efficient.
Reverse a spline so that the start point becomes the end point, and vice versa.
QuadraticSpline2d.reverse exampleSpline
--> QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 5, 1 )
--> , Point2d.fromCoordinates ( 3, 4 )
--> , Point2d.fromCoordinates ( 1, 1 )
--> )Scale a spline about the given center point by the given scale.
examplePolyline
|> QuadraticSpline2d.scaleAbout Point2d.origin 2
--> QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 2, 2 )
--> , Point2d.fromCoordinates ( 6, 8 )
--> , Point2d.fromCoordinates ( 10, 2 )
--> )Rotate a spline counterclockwise around a given center point by a given angle (in radians).
examplePolyline
|> QuadraticSpline2d.rotateAround Point2d.origin
(degrees 90)
--> QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( -1, 1 )
--> , Point2d.fromCoordinates ( -4, 3 )
--> , Point2d.fromCoordinates ( -1, 5 )
--> )Translate a spline by a given displacement.
displacement =
Vector2d.fromComponents ( 2, 3 )
exampleSpline
|> QuadraticSpline2d.translateBy displacement
--> QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 3, 4 )
--> , Point2d.fromCoordinates ( 5, 7 )
--> , Point2d.fromCoordinates ( 7, 4 )
--> )Mirror a spline across an axis.
QuadraticSpline2d.mirrorAcross Axis2d.x exampleSpline
--> QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 1, -1 )
--> , Point2d.fromCoordinates ( 3, -4 )
--> , Point2d.fromCoordinates ( 5, -1 )
--> )Take a spline defined in global coordinates, and return it expressed in local coordinates relative to a given reference frame.
localFrame =
Frame2d.atPoint (Point2d.fromCoordinates ( 1, 2 ))
QuadraticSpline2d.relativeTo localFrame exampleSpline
--> QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 0, -1 )
--> , Point2d.fromCoordinates ( 2, 2 )
--> , Point2d.fromCoordinates ( 4, -1 )
--> )Take a spline considered to be defined in local coordinates relative to a given reference frame, and return that spline expressed in global coordinates.
localFrame =
Frame2d.atPoint (Point2d.fromCoordinates ( 1, 2 ))
QuadraticSpline2d.placeIn localFrame exampleSpline
--> QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 2, 3 )
--> , Point2d.fromCoordinates ( 4, 6 )
--> , Point2d.fromCoordinates ( 6, 3 )
--> )Split a spline into two roughly equal halves. Equivalent to splitAt 0.5.
QuadraticSpline2d.bisect exampleSpline
--> ( QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 1, 1 )
--> , Point2d.fromCoordinates ( 2, 2.5 )
--> , Point2d.fromCoordinates ( 3, 2.5 )
--> )
--> , QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 3, 2.5 )
--> , Point2d.fromCoordinates ( 4, 2.5 )
--> , Point2d.fromCoordinates ( 5, 1 )
--> )
--> )Split a spline at a particular parameter value (in the range 0 to 1), resulting in two smaller splines.
QuadraticSpline2d.splitAt 0.75 exampleSpline
--> ( QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 1, 1 )
--> , Point2d.fromCoordinates ( 2.5, 3.25 )
--> , Point2d.fromCoordinates ( 4, 2.125 )
--> )
--> , QuadraticSpline2d.fromControlPoints
--> ( Point2d.fromCoordinates ( 4, 2.125 )
--> , Point2d.fromCoordinates ( 4.5, 1.75 )
--> , Point2d.fromCoordinates ( 5, 1 )
--> )
--> )