-- 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.0.1 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 -- --
-- >>> rotateXyzAboutX (V3 0 1 0) (pi/2) -- V3 0.0 6.123233995736766e-17 1.0 ---- --
-- >>> rotateXyzAboutX (V3 0 0 1) (pi/2) -- V3 0.0 (-1.0) 6.123233995736766e-17 --rotateXyzAboutX :: Floating a => V3 a -> a -> V3 a -- | Rotate a vector about the Y axis -- --
-- >>> rotateXyzAboutY (V3 0 0 1) (pi/2) -- V3 1.0 0.0 6.123233995736766e-17 ---- --
-- >>> rotateXyzAboutY (V3 1 0 0) (pi/2) -- V3 6.123233995736766e-17 0.0 (-1.0) --rotateXyzAboutY :: Floating a => V3 a -> a -> V3 a -- | Rotate a vector about the Z axis -- --
-- >>> rotateXyzAboutZ (V3 1 0 0) (pi/2) -- V3 6.123233995736766e-17 1.0 0.0 ---- --
-- >>> rotateXyzAboutZ (V3 0 1 0) (pi/2) -- V3 (-1.0) 6.123233995736766e-17 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 dcmOfQuat $ Quaternion s (V3 0.0 0.0 s) -- V3 (V3 0.0 1.0000000000000002 0.0) (V3 (-1.0000000000000002) 0.0 0.0) (V3 0.0 0.0 1.0000000000000002) ---- --
-- >>> 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)
--
--
--
-- >>> dcmOfEuler321 $ Euler {eYaw = pi/2, ePitch = 0, eRoll = 0}
-- V3 (V3 2.220446049250313e-16 1.0 0.0) (V3 (-1.0) 2.220446049250313e-16 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 instance Data a => Data (Euler a) instance Typeable Euler instance Eq a => Eq (Euler a) instance Show a => Show (Euler a) instance Functor Euler instance Foldable Euler instance Traversable Euler instance Ord a => Ord (Euler a) instance Generic (Euler a) instance Generic1 Euler instance Datatype D1Euler instance Constructor C1_0Euler instance Selector S1_0_0Euler instance Selector S1_0_1Euler instance Selector S1_0_2Euler