-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | 3d math including quaternions/euler angles/dcms and utility functions -- @package spatial-math @version 0.2.1.0 module SpatialMath -- | 3-2-1 Euler angle rotation sequence data Euler a Euler :: a -> a -> a -> Euler a eYaw :: Euler a -> a ePitch :: Euler a -> a eRoll :: Euler a -> a -- | Rotate a vector about the X axis -- --
--   >>> trunc $ rotateXyzAboutX (V3 0 1 0) (pi/2)
--   V3 0.0 0.0 1.0
--   
-- --
--   >>> trunc $ rotateXyzAboutX (V3 0 0 1) (pi/2)
--   V3 0.0 (-1.0) 0.0
--   
rotateXyzAboutX :: Floating a => V3 a -> a -> V3 a -- | Rotate a vector about the Y axis -- --
--   >>> trunc $ rotateXyzAboutY (V3 0 0 1) (pi/2)
--   V3 1.0 0.0 0.0
--   
-- --
--   >>> trunc $ rotateXyzAboutY (V3 1 0 0) (pi/2)
--   V3 0.0 0.0 (-1.0)
--   
rotateXyzAboutY :: Floating a => V3 a -> a -> V3 a -- | Rotate a vector about the Z axis -- --
--   >>> trunc $ rotateXyzAboutZ (V3 1 0 0) (pi/2)
--   V3 0.0 1.0 0.0
--   
-- --
--   >>> trunc $ rotateXyzAboutZ (V3 0 1 0) (pi/2)
--   V3 (-1.0) 0.0 0.0
--   
rotateXyzAboutZ :: Floating a => V3 a -> a -> V3 a -- | Convert quaternion to Euler angles -- --
--   >>> euler321OfQuat (Quaternion 1.0 (V3 0.0 0.0 0.0))
--   Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 0.0}
--   
-- --
--   >>> euler321OfQuat (Quaternion (sqrt(2)/2) (V3 (sqrt(2)/2) 0.0 0.0))
--   Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 1.5707963267948966}
--   
-- --
--   >>> euler321OfQuat (Quaternion (sqrt(2)/2) (V3 0.0 (sqrt(2)/2) 0.0))
--   Euler {eYaw = 0.0, ePitch = 1.5707963267948966, eRoll = 0.0}
--   
-- --
--   >>> euler321OfQuat (Quaternion (sqrt(2)/2) (V3 0.0 0.0 (sqrt(2)/2)))
--   Euler {eYaw = 1.5707963267948966, ePitch = -0.0, eRoll = 0.0}
--   
euler321OfQuat :: RealFloat a => Quaternion a -> Euler a -- | Convert DCM to euler angles -- --
--   >>> euler321OfDcm $ V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)
--   Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 0.0}
--   
-- --
--   >>> euler321OfDcm $ V3 (V3 0 1 0) (V3 (-1) 0 0) (V3 0 0 1)
--   Euler {eYaw = 1.5707963267948966, ePitch = -0.0, eRoll = 0.0}
--   
-- --
--   >>> let s = sqrt(2)/2 in euler321OfDcm $ V3 (V3 s s 0) (V3 (-s) s 0) (V3 0 0 1)
--   Euler {eYaw = 0.7853981633974483, ePitch = -0.0, eRoll = 0.0}
--   
euler321OfDcm :: RealFloat a => M33 a -> Euler a -- | Convert Euler angles to quaternion -- --
--   >>> quatOfEuler321 (Euler 0 0 0)
--   Quaternion 1.0 (V3 0.0 0.0 0.0)
--   
-- --
--   >>> quatOfEuler321 (Euler (pi/2) 0 0)
--   Quaternion 0.7071067811865476 (V3 0.0 0.0 0.7071067811865475)
--   
-- --
--   >>> quatOfEuler321 (Euler 0 (pi/2) 0)
--   Quaternion 0.7071067811865476 (V3 0.0 0.7071067811865475 0.0)
--   
-- --
--   >>> quatOfEuler321 (Euler 0 0 (pi/2))
--   Quaternion 0.7071067811865476 (V3 0.7071067811865475 0.0 0.0)
--   
quatOfEuler321 :: (Floating a, Ord a) => Euler a -> Quaternion a -- | convert a quaternion to a DCM -- --
--   >>> dcmOfQuat $ Quaternion 1.0 (V3 0.0 0.0 0.0)
--   V3 (V3 1.0 0.0 0.0) (V3 0.0 1.0 0.0) (V3 0.0 0.0 1.0)
--   
-- --
--   >>> let s = sqrt(2)/2 in fmap trunc $ dcmOfQuat $ Quaternion s (V3 0.0 0.0 s)
--   V3 (V3 0.0 1.0 0.0) (V3 (-1.0) 0.0 0.0) (V3 0.0 0.0 1.0)
--   
-- --
--   >>> dcmOfQuat $ Quaternion 0.9238795325112867 (V3 0.0 0.0 0.3826834323650898)
--   V3 (V3 0.7071067811865475 0.7071067811865476 0.0) (V3 (-0.7071067811865476) 0.7071067811865475 0.0) (V3 0.0 0.0 1.0)
--   
dcmOfQuat :: Num a => Quaternion a -> M33 a dcmOfQuatB2A :: (Conjugate a, RealFloat a) => Quaternion a -> M33 a -- | Convert DCM to euler angles -- --
--   >>> dcmOfEuler321 $ Euler {eYaw = 0.0, ePitch = 0, eRoll = 0}
--   V3 (V3 1.0 0.0 0.0) (V3 0.0 1.0 0.0) (V3 0.0 0.0 1.0)
--   
-- --
--   >>> fmap trunc $ dcmOfEuler321 $ Euler {eYaw = pi/2, ePitch = 0, eRoll = 0}
--   V3 (V3 0.0 1.0 0.0) (V3 (-1.0) 0.0 0.0) (V3 0.0 0.0 1.0)
--   
-- --
--   >>> dcmOfEuler321 $ Euler {eYaw = pi/4, ePitch = 0, eRoll = 0}
--   V3 (V3 0.7071067811865475 0.7071067811865476 0.0) (V3 (-0.7071067811865476) 0.7071067811865475 0.0) (V3 0.0 0.0 1.0)
--   
dcmOfEuler321 :: (Floating a, Ord a) => Euler a -> M33 a -- | convert a DCM to a quaternion -- --
--   >>> quatOfDcm $ V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)
--   Quaternion 1.0 (V3 0.0 0.0 0.0)
--   
-- --
--   >>> quatOfDcm $ V3 (V3 0 1 0) (V3 (-1) 0 0) (V3 0 0 1)
--   Quaternion 0.7071067811865476 (V3 0.0 0.0 0.7071067811865475)
--   
-- --
--   >>> let s = sqrt(2)/2 in quatOfDcm $ V3 (V3 s s 0) (V3 (-s) s 0) (V3 0 0 1)
--   Quaternion 0.9238795325112867 (V3 0.0 0.0 0.3826834323650898)
--   
quatOfDcm :: RealFloat a => M33 a -> Quaternion a quatOfDcmB2A :: (Conjugate a, RealFloat a) => M33 a -> Quaternion a -- | vec_b = R_a2b * vec_a rotVecByDcm :: Num a => M33 a -> V3 a -> V3 a -- | vec_a = R_a2b^T * vec_b rotVecByDcmB2A :: Num a => M33 a -> V3 a -> V3 a -- | vec_b = q_a2b * vec_a * q_a2b^(-1) vec_b = R(q_a2b) * vec_a rotVecByQuat :: Num a => Quaternion a -> V3 a -> V3 a rotVecByQuatB2A :: Num a => Quaternion a -> V3 a -> V3 a rotVecByEuler :: (Floating a, Ord a) => Euler a -> V3 a -> V3 a rotVecByEulerB2A :: (Floating a, Ord a) => Euler a -> V3 a -> V3 a -- | A 3x3 matrix with row-major representation type M33 a = V3 (V3 a) -- | A 3-dimensional vector data V3 a :: * -> * V3 :: SrictNotUnpackeda -> SrictNotUnpackeda -> SrictNotUnpackeda -> V3 a -- | Quaternions data Quaternion a :: * -> * Quaternion :: SrictNotUnpackeda -> SrictNotUnpacked(V3 a) -> Quaternion a module SpatialMathT class Rotation p a | p -> a compose :: Rotation p a => Rot f1 f2 p -> Rot f2 f3 p -> Rot f1 f3 p rot :: Rotation p a => Rot f1 f2 p -> V3T f1 a -> V3T f2 a rot' :: Rotation p a => Rot f1 f2 p -> V3T f2 a -> V3T f1 a toDcm :: Rotation p a => Rot f1 f2 p -> Rot f1 f2 (M33 a) transpose :: Rotation p a => Rot f1 f2 p -> Rot f2 f1 p newtype Rot f1 f2 r Rot :: r -> Rot f1 f2 r unR :: Rot f1 f2 r -> r newtype V3T f a V3T :: V3 a -> V3T f a unV :: V3T f a -> V3 a type M33T f1 f2 a = V3T f1 (V3T f2 a) cross :: Num a => V3T f a -> V3T f a -> V3T f a orthonormalize :: Floating a => Rot f1 f2 (M33 a) -> Rot f1 f2 (M33 a) instance Functor (V3T f) instance Foldable (V3T f) instance Traversable (V3T f) instance Applicative (V3T f) instance Additive (V3T f) instance Storable a => Storable (V3T f a) instance Num a => Num (V3T f a) instance Fractional a => Fractional (V3T f a) instance Eq a => Eq (V3T f a) instance Show a => Show (V3T f a) instance Generic1 (V3T f) instance Generic (V3T f a) instance Functor (Rot f1 f2) instance Foldable (Rot f1 f2) instance Traversable (Rot f1 f2) instance Storable r => Storable (Rot f1 f2 r) instance Num r => Num (Rot f1 f2 r) instance Fractional r => Fractional (Rot f1 f2 r) instance Eq r => Eq (Rot f1 f2 r) instance Show r => Show (Rot f1 f2 r) instance Serialize r => Serialize (Rot f1 f2 r) instance Generic1 (Rot f1 f2) instance Generic (Rot f1 f2 r) instance Datatype D1V3T instance Constructor C1_0V3T instance Selector S1_0_0V3T instance Datatype D1Rot instance Constructor C1_0Rot instance Selector S1_0_0Rot instance Num a => Rotation (M33 a) a instance Num a => Rotation (Quaternion a) a instance Serialize a => Serialize (V3T f a)