0 | module Data.NumIdr.Transform.Affine
 1 |
 2 | import Data.Vect
 3 | import Data.NumIdr.Interfaces
 4 | import Data.NumIdr.Array
 5 | import Data.NumIdr.Vector
 6 | import Data.NumIdr.Matrix
 7 | import Data.NumIdr.Homogeneous
 8 | import Data.NumIdr.Transform.Point
 9 | import Data.NumIdr.Transform.Transform
10 |
11 | %default total
12 |
13 |
14 | ||| An affine transform can contain any invertible affine map.
15 | public export
16 | Affine : Nat -> Type -> Type
17 | Affine = Transform TAffine
18 |
19 | ||| Determine if a homogeneous matrix represents an affine transform
20 | ||| (i.e. is invertible).
21 | export
22 | isAffine : FieldCmp a => HMatrix' n a -> Bool
23 | isAffine mat = isHMatrix mat && invertible (getMatrix mat)
24 |
25 |
26 | ||| Try to construct an affine transform from a homogeneous matrix.
27 | export
28 | fromHMatrix : FieldCmp a => HMatrix' n a -> Maybe (Affine n a)
29 | fromHMatrix mat = if isAffine mat
30 |                   then Just (unsafeMkTrans mat)
31 |                   else Nothing
32 |