Safe Haskell | None |
---|---|
Language | Haskell2010 |
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).
- type Bezier a = (Bool, a, a, a)
- type QuadraticBezier a = (a, a, a)
- type CubicBezier a = (a, a, a, a)
- bezier :: (Ord a, Fractional a) => V2 a -> V2 a -> V2 a -> Bezier (V2 a)
- bez3 :: V2 a -> V2 a -> V2 a -> QuadraticBezier (V2 a)
- bez4 :: V2 a -> V2 a -> V2 a -> V2 a -> CubicBezier (V2 a)
- fmapBezier :: (a -> b) -> Bezier a -> Bezier b
- fmapQuadraticBezier :: (a -> b) -> QuadraticBezier a -> QuadraticBezier b
- fmapCubicBezier :: (a -> b) -> CubicBezier a -> CubicBezier b
- transformBezier :: Num a => M44 a -> Bezier (V2 a) -> Bezier (V2 a)
- transformQuadraticBezier :: Num a => M44 a -> QuadraticBezier (V2 a) -> QuadraticBezier (V2 a)
- transformCubicBezier :: Num a => M44 a -> CubicBezier (V2 a) -> CubicBezier (V2 a)
- triangleArea :: Num a => V2 a -> V2 a -> V2 a -> a
- bezToBez3 :: Bezier a -> QuadraticBezier a
- bez3ToBez :: (Ord a, Fractional a, Unbox a) => QuadraticBezier (V2 a) -> Bezier (V2 a)
- bez3ToBezInner :: (Ord a, Fractional a, Unbox a) => QuadraticBezier (V2 a) -> Bezier (V2 a)
- bez3ToBezOuter :: (Ord a, Fractional a, Unbox a) => QuadraticBezier (V2 a) -> Bezier (V2 a)
- bez4ToBez :: (Ord a, Fractional a, Unbox a) => CubicBezier (V2 a) -> Vector (Bezier (V2 a))
- bez4ToBezInner :: (Ord a, Fractional a, Unbox a) => CubicBezier (V2 a) -> Vector (Bezier (V2 a))
- bez4ToBezOuter :: (Ord a, Fractional a, Unbox a) => CubicBezier (V2 a) -> Vector (Bezier (V2 a))
- bez4sToPath :: (RealFloat a, Unbox a) => a -> a -> Vector (CubicBezier (V2 a)) -> Vector (V2 a)
- flipBez4 :: CubicBezier a -> CubicBezier a
- demoteCubic :: (Fractional a, Unbox a) => CubicBezier (V2 a) -> Vector (QuadraticBezier (V2 a))
- deCasteljau :: (Additive f, R1 f, R2 f, Num a) => a -> [f a] -> f a
- subdivideAdaptive :: (RealFloat a, Unbox a) => a -> a -> QuadraticBezier (V2 a) -> Vector (V2 a)
- subdivideAdaptive3 :: (RealFloat a, Unbox a) => a -> a -> QuadraticBezier (V2 a) -> Vector (V2 a)
- subdivideAdaptive4 :: (RealFloat a, Unbox a) => a -> a -> CubicBezier (V2 a) -> Vector (V2 a)
- cleanSeqDupes :: (Eq a, Unbox a) => Vector a -> Vector a
- arcBez4 :: (Epsilon a, RealFloat a) => a -> a -> a -> a -> [CubicBezier (V2 a)]
- arcBez3 :: (Epsilon a, RealFloat a, Unbox a) => a -> a -> a -> a -> Vector (QuadraticBezier (V2 a))
- ellipseBez4 :: (Epsilon a, RealFloat a) => a -> a -> [CubicBezier (V2 a)]
- ellipseBez3 :: (Epsilon a, RealFloat a, Unbox a) => a -> a -> Vector (QuadraticBezier (V2 a))
- cornerBez4 :: RealFloat a => a -> a -> CubicBezier (V2 a)
- cornerBez3 :: (RealFloat a, Unbox a) => a -> a -> Vector (QuadraticBezier (V2 a))
Types
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 #
fmapQuadraticBezier :: (a -> b) -> QuadraticBezier a -> QuadraticBezier b Source #
fmapCubicBezier :: (a -> b) -> CubicBezier a -> CubicBezier b Source #
transformQuadraticBezier :: Num a => M44 a -> QuadraticBezier (V2 a) -> QuadraticBezier (V2 a) Source #
transformCubicBezier :: Num a => M44 a -> CubicBezier (V2 a) -> CubicBezier (V2 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.
flipBez4 :: CubicBezier a -> CubicBezier a Source #
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.
ellipseBez3 :: (Epsilon a, RealFloat a, Unbox a) => a -> a -> Vector (QuadraticBezier (V2 a)) Source #
cornerBez4 :: RealFloat a => a -> a -> CubicBezier (V2 a) Source #
cornerBez3 :: (RealFloat a, Unbox a) => a -> a -> Vector (QuadraticBezier (V2 a)) Source #