linear-tests-0.1.1.0: src/Linear/Quaternion/Arbitrary.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Linear.Quaternion.Arbitrary (
CartesianQuaternion(..)
) where
import Linear.Epsilon
import Linear.Matrix ()
import Linear.Quaternion
import Linear.V3.Arbitrary
import Test.QuickCheck
-- | `Arbitrary Quaternion` instance
instance (Arbitrary a, Epsilon a, Floating a) => Arbitrary (Quaternion a) where
arbitrary = do
UnitV3 v <- arbitrary
r <- arbitrary
return $ axisAngle v r
-- | Arbitrary instances of this type are restricted to increment of 90 degrees along cartesian axis
newtype CartesianQuaternion a = CartesianQuaternion { unCartesianQuaternion :: Quaternion a } deriving (Show)
instance (Arbitrary a, Epsilon a, Floating a) => Arbitrary (CartesianQuaternion a) where
arbitrary = do
CartesianUnitV3 v <- arbitrary
r <- elements [0, pi/2, pi, 3*pi/2]
return . CartesianQuaternion $ axisAngle v r