Implmement HMatrix to Rigid conversion

This commit is contained in:
Kiana Sheibani 2022-12-09 15:29:40 -05:00
parent eddb0e318c
commit 13d5f7aa21
Signed by: toki
GPG key ID: 6CB106C25E86A9F7
5 changed files with 33 additions and 1 deletions

View file

@ -9,7 +9,7 @@ import Data.NP
-- A Nat-based range function with better semantics -- A Nat-based range function with better semantics
export public export
range : Nat -> Nat -> List Nat range : Nat -> Nat -> List Nat
range x y = if x < y then assert_total $ takeBefore (>= y) (countFrom x S) range x y = if x < y then assert_total $ takeBefore (>= y) (countFrom x S)
else [] else []

View file

@ -32,6 +32,18 @@ fromMatrix mat = if isOrthonormal' mat then Just (unsafeMkTrans (matrixToH mat))
else Nothing else Nothing
||| Determine if a homogeneous matrix represents a rotation.
export
isOrthonormal : Eq a => Num a => HMatrix' n a -> Bool
isOrthonormal {n} mat with (viewShape mat)
_ | Shape [S n, S n] = isHMatrix mat && all (==0) (mat !!.. [EndBound last, One last])
&& isOrthonormal' (getMatrix mat)
export
fromHMatrix : Eq a => Num a => HMatrix' n a -> Maybe (Orthonormal n a)
fromHMatrix mat = if isOrthonormal mat then Just (unsafeMkTrans mat) else Nothing
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Reflections -- Reflections
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View file

@ -26,6 +26,10 @@ export
isRigid : FieldCmp a => HMatrix' n a -> Bool isRigid : FieldCmp a => HMatrix' n a -> Bool
isRigid mat = isHMatrix mat && isRotation' (getMatrix mat) isRigid mat = isHMatrix mat && isRotation' (getMatrix mat)
export
fromHMatrix : FieldCmp a => HMatrix' n a -> Maybe (Rigid n a)
fromHMatrix mat = if isRigid mat then Just (unsafeMkTrans mat) else Nothing
export export
rigid2D : Vector 2 Double -> Double -> Rigid 2 Double rigid2D : Vector 2 Double -> Double -> Rigid 2 Double

View file

@ -35,6 +35,7 @@ export
isRotation : FieldCmp a => HMatrix' n a -> Bool isRotation : FieldCmp a => HMatrix' n a -> Bool
isRotation {n} mat with (viewShape mat) isRotation {n} mat with (viewShape mat)
_ | Shape [S n, S n] = isHMatrix mat && all (==0) (mat !!.. [EndBound last, One last]) _ | Shape [S n, S n] = isHMatrix mat && all (==0) (mat !!.. [EndBound last, One last])
&& isRotation' (getMatrix mat)
export export
fromHMatrix : FieldCmp a => HMatrix' n a -> Maybe (Rotation n a) fromHMatrix : FieldCmp a => HMatrix' n a -> Maybe (Rotation n a)

View file

@ -49,6 +49,21 @@ export
basis : Num a => {n : _} -> (i : Fin n) -> Vector n a basis : Num a => {n : _} -> (i : Fin n) -> Vector n a
basis i = fromFunction _ (\[j] => if i == j then 1 else 0) basis i = fromFunction _ (\[j] => if i == j then 1 else 0)
||| The first basis vector.
export
basisX : {n : _} -> Num a => Vector (1 + n) a
basisX = basis FZ
||| The second basis vector.
export
basisY : {n : _} -> Num a => Vector (2 + n) a
basisY = basis (FS FZ)
||| The third basis vector.
export
basisZ : {n : _} -> Num a => Vector (3 + n) a
basisZ = basis (FS (FS FZ))
||| Calculate the 2D unit vector with the given angle off the x-axis. ||| Calculate the 2D unit vector with the given angle off the x-axis.
export export