opensolid/geometry/2.0.1

NOTE: this package is not compatible with Elm 0.19.1

OpenSolid.QuadraticSpline3d

QuadraticSpline3d

A QuadraticSpline3d is a quadratic Bézier curve in 3D defined by three control points. This module contains functionality for

  • Evaluating points and derivatives along a spline
  • Scaling, rotating, translating or mirroring a spline
  • Converting a spline between local and global coordinates in different reference frames
type alias QuadraticSpline3d =
QuadraticSpline3d

Constructors

fromControlPoints : ( Point3d, Point3d, Point3d ) -> QuadraticSpline3d

Construct a spline from its three control points:

exampleSpline =
    QuadraticSpline3d.fromControlPoints
        ( Point3d.fromCoordinates ( 1, 1, 1 )
        , Point3d.fromCoordinates ( 3, 2, 1 )
        , Point3d.fromCoordinates ( 3, 3, 3 )
        )
on : SketchPlane3d -> QuadraticSpline2d -> QuadraticSpline3d

Construct a 3D spline lying on a sketch plane by providing a 2D spline specified in XY coordinates within the sketch plane.

QuadraticSpline3d.on SketchPlane3d.xz <|
    QuadraticSpline2d.fromControlPoints
        ( Point2d.fromCoordinates ( 1, 1 )
        , Point2d.fromCoordinates ( 3, 4 )
        , Point2d.fromCoordinates ( 5, 1 )
        )
--> QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 1, 0, 1 )
-->     , Point3d.fromCoordinates ( 3, 0, 4 )
-->     , Point3d.fromCoordinates ( 5, 0, 1 )
-->     )

Properties

controlPoints : QuadraticSpline3d -> ( Point3d, Point3d, Point3d )

Get the control points of a spline as a tuple.

( p1, p2, p3 ) =
    QuadraticSpline3d.controlPoints exampleSpline




--> p1 = Point3d.fromCoordinates ( 1, 1, 1 )
--> p2 = Point3d.fromCoordinates ( 3, 2, 1 )
--> p3 = Point3d.fromCoordinates ( 3, 3, 3 )
startPoint : QuadraticSpline3d -> Point3d

Get the start point of a spline. This is equal to the spline's first control point.

QuadraticSpline3d.startPoint exampleSpline
--> Point3d.fromCoordinates ( 1, 1, 1 )
endPoint : QuadraticSpline3d -> Point3d

Get the end point of a spline. This is equal to the spline's last control point.

QuadraticSpline3d.endPoint exampleSpline
--> Point3d.fromCoordinates ( 3, 3, 3 )
startDerivative : QuadraticSpline3d -> Vector3d

Get the start derivative of a spline. This is equal to twice the vector from the spline's first control point to its second.

QuadraticSpline3d.startDerivative exampleSpline
--> Vector3d.fromComponents ( 4, 2, 0 )
endDerivative : QuadraticSpline3d -> Vector3d

Get the end derivative of a spline. This is equal to twice the vector from the spline's second control point to its third.

QuadraticSpline3d.endDerivative exampleSpline
--> Vector3d.fromComponents ( 0, 2, 4 )

Evaluation

pointOn : QuadraticSpline3d -> Float -> Point3d

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.

QuadraticSpline3d.pointOn exampleSpline 0
--> Point3d.fromCoordinates ( 1, 1, 1 )


QuadraticSpline3d.pointOn exampleSpline 0.5
--> Point3d.fromCoordinates ( 2.5, 2, 1.5 )


QuadraticSpline3d.pointOn exampleSpline 1
--> Point3d.fromCoordinates ( 3, 3, 3 )
derivative : QuadraticSpline3d -> Float -> Vector3d

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.

QuadraticSpline3d.derivative exampleSpline 0
--> Vector3d.fromComponents ( 4, 2, 0 )


QuadraticSpline3d.derivative exampleSpline 0.5
--> Vector3d.fromComponents ( 2, 2, 2 )


QuadraticSpline3d.derivative exampleSpline 1
--> Vector3d.fromComponents ( 0, 2, 4 )

Note that the derivative interpolates linearly from end to end.

evaluate : QuadraticSpline3d -> Float -> ( Point3d, Vector3d )

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;

QuadraticSpline3d.evaluate spline t

is equivalent to

( QuadraticSpline3d.pointOn spline t
, QuadraticSpline3d.derivative spline t
)

but is more efficient.

Transformations

reverse : QuadraticSpline3d -> QuadraticSpline3d

Reverse a spline so that the start point becomes the end point, and vice versa.

QuadraticSpline3d.reverse exampleSpline
--> QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 3, 3, 3 )
-->     , Point3d.fromCoordinates ( 3, 2, 1 )
-->     , Point3d.fromCoordinates ( 1, 1, 1 )
-->     )
scaleAbout : Point3d -> Float -> QuadraticSpline3d -> QuadraticSpline3d

Scale a spline about the given center point by the given scale.

exampleSpline
    |> QuadraticSpline3d.scaleAbout Point3d.origin 2
--> QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 2, 2, 2 )
-->     , Point3d.fromCoordinates ( 6, 4, 2 )
-->     , Point3d.fromCoordinates ( 6, 6, 6 )
-->     )
rotateAround : Axis3d -> Float -> QuadraticSpline3d -> QuadraticSpline3d

Rotate a spline counterclockwise around a given axis by a given angle (in radians).

exampleSpline
    |> QuadraticSpline3d.rotateAround Axis3d.z
        (degrees 90)
--> QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( -1, 1, 1 )
-->     , Point3d.fromCoordinates ( -2, 3, 1 )
-->     , Point3d.fromCoordinates ( -3, 3, 3 )
-->     )
translateBy : Vector3d -> QuadraticSpline3d -> QuadraticSpline3d

Translate a spline by a given displacement.

displacement =
    Vector3d.fromComponents ( 2, 3, 1 )


exampleSpline
    |> QuadraticSpline3d.translateBy displacement
--> QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 3, 4, 2 )
-->     , Point3d.fromCoordinates ( 5, 5, 2 )
-->     , Point3d.fromCoordinates ( 5, 6, 4 )
-->     )
mirrorAcross : Plane3d -> QuadraticSpline3d -> QuadraticSpline3d

Mirror a spline across a plane.

QuadraticSpline3d.mirrorAcross Plane3d.xy exampleSpline
--> QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 1, 1, -1 )
-->     , Point3d.fromCoordinates ( 3, 2, -1 )
-->     , Point3d.fromCoordinates ( 3, 3, -3 )
-->     )
projectOnto : Plane3d -> QuadraticSpline3d -> QuadraticSpline3d

Project a spline onto a plane.

QuadraticSpline3d.projectOnto Plane3d.xy exampleSpline
--> QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 1, 1, 0 )
-->     , Point3d.fromCoordinates ( 3, 2, 0 )
-->     , Point3d.fromCoordinates ( 3, 3, 0 )
-->     )

Coordinate conversions

relativeTo : Frame3d -> QuadraticSpline3d -> QuadraticSpline3d

Take a spline defined in global coordinates, and return it expressed in local coordinates relative to a given reference frame.

localFrame =
    Frame3d.atPoint
        (Point3d.fromCoordinates ( 1, 2, 3 ))


QuadraticSpline3d.relativeTo localFrame exampleSpline
--> QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 0, -1, -2 )
-->     , Point3d.fromCoordinates ( 2, 0, -2 )
-->     , Point3d.fromCoordinates ( 2, 1, 0 )
-->     )
placeIn : Frame3d -> QuadraticSpline3d -> QuadraticSpline3d

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 =
    Frame3d.atPoint
        (Point3d.fromCoordinates ( 1, 2, 3 ))


QuadraticSpline3d.placeIn localFrame exampleSpline
--> QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 2, 3, 4 )
-->     , Point3d.fromCoordinates ( 4, 4, 4 )
-->     , Point3d.fromCoordinates ( 4, 5, 6 )
-->     )

Sketch planes

projectInto : SketchPlane3d -> QuadraticSpline3d -> QuadraticSpline2d

Project a spline into a given sketch plane. Conceptually, this projects the spline onto the plane and then expresses the projected spline in 2D sketch coordinates.

exampleSpline
    |> QuadraticSpline3d.projectInto SketchPlane3d.yz
--> QuadraticSpline2d.fromControlPoints
-->     ( Point2d.fromCoordinates ( 1, 1 )
-->     , Point2d.fromCoordinates ( 2, 1 )
-->     , Point2d.fromCoordinates ( 3, 3 )
-->     )

Subdivision

bisect : QuadraticSpline3d -> ( QuadraticSpline3d, QuadraticSpline3d )

Split a spline into two roughly equal halves. Equivalent to splitAt 0.5.

QuadraticSpline3d.bisect exampleSpline
--> ( QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 1, 1, 1 )
-->     , Point3d.fromCoordinates ( 2, 2.5 )
-->     , Point3d.fromCoordinates ( 3, 2.5 )
-->     )
--> , QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 3, 2.5 )
-->     , Point3d.fromCoordinates ( 4, 2.5 )
-->     , Point3d.fromCoordinates ( 3, 3, 3 )
-->     )
--> )
Float
-> QuadraticSpline3d
-> ( QuadraticSpline3d, QuadraticSpline3d )

Split a spline at a particular parameter value (in the range 0 to 1), resulting in two smaller splines.

QuadraticSpline3d.splitAt 0.75 exampleSpline
--> ( QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 1, 1, 1 )
-->     , Point3d.fromCoordinates ( 2, 1.5, 1 )
-->     , Point3d.fromCoordinates ( 2.5, 2, 1.5 )
-->     )
--> , QuadraticSpline3d.fromControlPoints
-->     ( Point3d.fromCoordinates ( 2.5, 2, 1.5 )
-->     , Point3d.fromCoordinates ( 3, 2.5, 2 )
-->     , Point3d.fromCoordinates ( 3, 3, 3 )
-->     )
--> )