gelatin-0.1.0.1: A graphics description language.

Safe HaskellNone
LanguageHaskell2010

Gelatin.Core.Bezier

Contents

Description

Here is a simple bezier algebra. To better server drawing beziers the Bezier type's first record is a boolean representing its fill direction (inner or outer).

Synopsis

Types

type Bezier a = (Bool, a, a, a) Source #

A bezier that fills internally or externally.

type QuadraticBezier a = (a, a, a) Source #

A simple quadratic bezier with no explicit fill direction.

type CubicBezier a = (a, a, a, a) Source #

A simple cubic bezier with no explicit fill direction.

Smart Constructors

bezier :: (Ord a, Fractional a) => V2 a -> V2 a -> V2 a -> Bezier (V2 a) Source #

Create a bezier primitive. The area of the triangle formed by the bezier's three points will be used to determine the orientation.

bez3 :: V2 a -> V2 a -> V2 a -> QuadraticBezier (V2 a) Source #

Create a quadratic bezier. This is an alias of QuadraticBezier.

bez4 :: V2 a -> V2 a -> V2 a -> V2 a -> CubicBezier (V2 a) Source #

Create a cubic bezier. This is an alias of CubicBezier.

Special helpers

fmapBezier :: (a -> b) -> Bezier a -> Bezier b Source #

transformBezier :: Num a => M44 a -> Bezier (V2 a) -> Bezier (V2 a) Source #

triangleArea :: Num a => V2 a -> V2 a -> V2 a -> a Source #

Conversion

bezToBez3 :: Bezier a -> QuadraticBezier a Source #

Convert a Bezier to a QuadraticBezier.

bez3ToBez :: (Ord a, Fractional a, Unbox a) => QuadraticBezier (V2 a) -> Bezier (V2 a) Source #

Convert a quadratic bezier into a bezier primitive and derives the winding (which determines drawing an inner or outer bez) from the order of control points.

bez3ToBezInner :: (Ord a, Fractional a, Unbox a) => QuadraticBezier (V2 a) -> Bezier (V2 a) Source #

Convert a quadratic bezier into a bezier primitive that fills inner.

bez3ToBezOuter :: (Ord a, Fractional a, Unbox a) => QuadraticBezier (V2 a) -> Bezier (V2 a) Source #

Convert a quadratic bezier into a bezier primitive that fills outer.

bez4ToBez :: (Ord a, Fractional a, Unbox a) => CubicBezier (V2 a) -> Vector (Bezier (V2 a)) Source #

Convert a cubic bezier into a list of drawable bezier primitives.

bez4ToBezInner :: (Ord a, Fractional a, Unbox a) => CubicBezier (V2 a) -> Vector (Bezier (V2 a)) Source #

Convert a cubic bezier into a list of drawable bezier primitives that fill the inner bezier.

bez4ToBezOuter :: (Ord a, Fractional a, Unbox a) => CubicBezier (V2 a) -> Vector (Bezier (V2 a)) Source #

Convert a cubic bezier into a list of drawable bezier primitives that fill the inner bezier.

bez4sToPath :: (RealFloat a, Unbox a) => a -> a -> Vector (CubicBezier (V2 a)) -> Vector (V2 a) Source #

Convert a list of cubic beziers into a smooth path.

demoteCubic :: (Fractional a, Unbox a) => CubicBezier (V2 a) -> Vector (QuadraticBezier (V2 a)) Source #

Approximate a cubic bezier with a list of four quadratic beziers.

Subdivision

deCasteljau :: (Additive f, R1 f, R2 f, Num a) => a -> [f a] -> f a Source #

Compute the point at t along an N-bezier curve.

subdivideAdaptive :: (RealFloat a, Unbox a) => a -> a -> QuadraticBezier (V2 a) -> Vector (V2 a) Source #

Adaptively subdivide the quadratic bezier into a series of points (line segments). i.e. Generate more points along the part of the curve with greater curvature. @see http://www.antigrain.com/research/adaptive_bezier/index.html and http://www.antigrain.com/__code/src/agg_curves.cpp.html

subdivideAdaptive3 :: (RealFloat a, Unbox a) => a -> a -> QuadraticBezier (V2 a) -> Vector (V2 a) Source #

Adaptively subdivide the quadratic bezier into a series of points (line segments). i.e. Generate more points along the part of the curve with greater curvature. @see http://www.antigrain.com/research/adaptive_bezier/index.html and http://www.antigrain.com/__code/src/agg_curves.cpp.html

subdivideAdaptive4 :: (RealFloat a, Unbox a) => a -> a -> CubicBezier (V2 a) -> Vector (V2 a) Source #

Adaptively subdivide the cubic bezier into a series of points (line segments).

cleanSeqDupes :: (Eq a, Unbox a) => Vector a -> Vector a Source #

Removes sequential duplicates from a vector.

Shapes

arcBez4 :: (Epsilon a, RealFloat a) => a -> a -> a -> a -> [CubicBezier (V2 a)] Source #

Create a list of cubic beziers representing an arc along an ellipse with width w, height h and total angle `stop - start` radians, beginning start radians above the x-axis.

arcBez3 :: (Epsilon a, RealFloat a, Unbox a) => a -> a -> a -> a -> Vector (QuadraticBezier (V2 a)) Source #

ellipseBez4 :: (Epsilon a, RealFloat a) => a -> a -> [CubicBezier (V2 a)] Source #

Create a list of cubic beziers that represent an entire closed ellipse.

cornerBez4 :: RealFloat a => a -> a -> CubicBezier (V2 a) Source #

cornerBez3 :: (RealFloat a, Unbox a) => a -> a -> Vector (QuadraticBezier (V2 a)) Source #