Safe Haskell | Safe-Inferred |
---|
This module provide some helpers in order to perform basic geometric transformation on the drawable primitives.
You can combine the transformation is mappend
or
the `(<>)` operator from Data.Monoid .
- data Transformation = Transformation {
- _transformA :: !Float
- _transformC :: !Float
- _transformE :: !Float
- _transformB :: !Float
- _transformD :: !Float
- _transformF :: !Float
- applyTransformation :: Transformation -> Point -> Point
- applyVectorTransformation :: Transformation -> Vector -> Vector
- translate :: Vector -> Transformation
- scale :: Float -> Float -> Transformation
- rotate :: Float -> Transformation
- rotateCenter :: Float -> Point -> Transformation
- skewX :: Float -> Transformation
- skewY :: Float -> Transformation
- inverseTransformation :: Transformation -> Maybe Transformation
Documentation
data Transformation Source
Represent a 3*3 matrix for homogenous coordinates.
| A C E | | B D F | | 0 0 1 |
Transformation | |
|
applyTransformation :: Transformation -> Point -> PointSource
Effectively transform a point given a transformation.
applyVectorTransformation :: Transformation -> Vector -> VectorSource
Effectively transform a vector given a transformation. The translation part won't be applied.
translate :: Vector -> TransformationSource
Perform a translation of the given primitives.
fill . transform (applyTransformation $ translate (V2 100 100)) $ rectangle (V2 40 40) 40 40
scale :: Float -> Float -> TransformationSource
Perform a scaling of the given primitives.
fill . transform (applyTransformation $ scale 2 2) $ rectangle (V2 40 40) 40 40
:: Float | Rotation angle in radian. |
-> Transformation |
Create a transformation representing a rotation on the plane.
fill . transform (applyTransformation $ rotate 0.2) $ rectangle (V2 40 40) 120 120
:: Float | Rotation angle in radian |
-> Point | Rotation center |
-> Transformation |
Create a transformation representing a rotation on the plane. The rotation center is given in parameter
fill . transform (applyTransformation $ rotateCenter 0.2 (V2 200 200)) $ rectangle (V2 40 40) 120 120
skewX :: Float -> TransformationSource
Skew transformation along the X axis.
fill . transform (applyTransformation $ skewX 0.3) $ rectangle (V2 50 50) 80 80
skewY :: Float -> TransformationSource
Skew transformation along the Y axis.
fill . transform (applyTransformation $ skewY 0.3) $ rectangle (V2 50 50) 80 80
inverseTransformation :: Transformation -> Maybe TransformationSource
Inverse a transformation (if possible)