rings-0.0.2.4: Ring-like objects.

Safe HaskellSafe
LanguageHaskell2010

Data.Semifield.Quaternion

Synopsis

Documentation

data Quaternion a Source #

Constructors

Quaternion !a !(V3 a) 
Instances
Functor Quaternion Source # 
Instance details

Defined in Data.Semifield.Quaternion

Methods

fmap :: (a -> b) -> Quaternion a -> Quaternion b #

(<$) :: a -> Quaternion b -> Quaternion a #

Foldable Quaternion Source # 
Instance details

Defined in Data.Semifield.Quaternion

Methods

fold :: Monoid m => Quaternion m -> m #

foldMap :: Monoid m => (a -> m) -> Quaternion a -> m #

foldr :: (a -> b -> b) -> b -> Quaternion a -> b #

foldr' :: (a -> b -> b) -> b -> Quaternion a -> b #

foldl :: (b -> a -> b) -> b -> Quaternion a -> b #

foldl' :: (b -> a -> b) -> b -> Quaternion a -> b #

foldr1 :: (a -> a -> a) -> Quaternion a -> a #

foldl1 :: (a -> a -> a) -> Quaternion a -> a #

toList :: Quaternion a -> [a] #

null :: Quaternion a -> Bool #

length :: Quaternion a -> Int #

elem :: Eq a => a -> Quaternion a -> Bool #

maximum :: Ord a => Quaternion a -> a #

minimum :: Ord a => Quaternion a -> a #

sum :: Num a => Quaternion a -> a #

product :: Num a => Quaternion a -> a #

Distributive Quaternion Source # 
Instance details

Defined in Data.Semifield.Quaternion

Methods

distribute :: Functor f => f (Quaternion a) -> Quaternion (f a) #

collect :: Functor f => (a -> Quaternion b) -> f a -> Quaternion (f b) #

distributeM :: Monad m => m (Quaternion a) -> Quaternion (m a) #

collectM :: Monad m => (a -> Quaternion b) -> m a -> Quaternion (m b) #

Representable Quaternion Source # 
Instance details

Defined in Data.Semifield.Quaternion

Associated Types

type Rep Quaternion :: Type #

Methods

tabulate :: (Rep Quaternion -> a) -> Quaternion a #

index :: Quaternion a -> Rep Quaternion -> a #

Foldable1 Quaternion Source # 
Instance details

Defined in Data.Semifield.Quaternion

Methods

fold1 :: Semigroup m => Quaternion m -> m #

foldMap1 :: Semigroup m => (a -> m) -> Quaternion a -> m #

toNonEmpty :: Quaternion a -> NonEmpty a #

Eq a => Eq (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

Methods

(==) :: Quaternion a -> Quaternion a -> Bool #

(/=) :: Quaternion a -> Quaternion a -> Bool #

Ord a => Ord (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

Show a => Show (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

Generic (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

Associated Types

type Rep (Quaternion a) :: Type -> Type #

Methods

from :: Quaternion a -> Rep (Quaternion a) x #

to :: Rep (Quaternion a) x -> Quaternion a #

Semigroup a => Semigroup (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

Monoid a => Monoid (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

Ring a => Semiring (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

Group a => Group (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

Ring a => Ring (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

Field a => Semifield (Quaternion a) Source #

(Right) division ring over a.

Note that, due to non-commutativity, it is possible to divide in two different ways.

See https://en.wikipedia.org/wiki/Quaternion#Unit_quaternion.

>>> q = Quaternion 1 (V3 1 2 3) :: QuatR
>>> q // q
Quaternion (15 % 1) (V3 (0 % 1) (0 % 1) (0 % 1))
Instance details

Defined in Data.Semifield.Quaternion

Generic1 Quaternion Source # 
Instance details

Defined in Data.Semifield.Quaternion

Associated Types

type Rep1 Quaternion :: k -> Type #

type Rep Quaternion Source # 
Instance details

Defined in Data.Semifield.Quaternion

type Rep (Quaternion a) Source # 
Instance details

Defined in Data.Semifield.Quaternion

type Rep (Quaternion a) = D1 (MetaData "Quaternion" "Data.Semifield.Quaternion" "rings-0.0.2.4-9dBg3spVdomqRKHFxJllu" False) (C1 (MetaCons "Quaternion" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a) :*: S1 (MetaSel (Nothing :: Maybe Symbol) SourceUnpack SourceStrict DecidedStrict) (Rec0 (V3 a))))
type Rep1 Quaternion Source # 
Instance details

Defined in Data.Semifield.Quaternion

type Rep1 Quaternion = D1 (MetaData "Quaternion" "Data.Semifield.Quaternion" "rings-0.0.2.4-9dBg3spVdomqRKHFxJllu" False) (C1 (MetaCons "Quaternion" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) Par1 :*: S1 (MetaSel (Nothing :: Maybe Symbol) SourceUnpack SourceStrict DecidedStrict) (Rec1 V3)))

refpos :: Field a => V3 a Source #

iter4 :: Ring a => Quaternion a -> V3 a -> V3 a Source #

quat :: a -> a -> a -> a -> Quaternion a Source #

Obtain a Quaternion from 4 base field elements.

real :: Quaternion a -> a Source #

Real or scalar part of a quaternion.

imag :: Quaternion a -> V3 a Source #

Imaginary or vector part of a quaternion.

norm :: Semiring a => Quaternion a -> a Source #

Squared norm of a quaternion.

 norm x == real $ x >< conj x

rotate :: Ring a => Quaternion a -> V3 a -> V3 a Source #

Use a quaternion to rotate a vector.

rotate qk . rotate qj $ V3 1 1 0 V3 1 (-1) 0

prop_conj :: Ring a => (a -> a -> Bool) -> Quaternion a -> Quaternion a -> Bool Source #

qi :: Unital a => Quaternion a Source #

The i quaternion.

Represents a \( \pi \) radian rotation about the x axis.

>>> rotate (qi :: QuatM) $ V3 1 0 0
V3 1.000000 0.000000 0.000000
>>> rotate (qi :: QuatM) $ V3 0 1 0
V3 0.000000 -1.000000 0.000000
>>> rotate (qi :: QuatM) $ V3 0 0 1
V3 0.000000 0.000000 -1.000000
>>> qi >< qj
Quaternion 0 (V3 0 0 1)

qj :: Unital a => Quaternion a Source #

The j quaternion.

Represents a \( \pi \) radian rotation about the y axis.

>>> rotate (qj :: QuatM) $ V3 1 0 0
V3 -1.000000 0.000000 0.000000
>>> rotate (qj :: QuatM) $ V3 0 1 0
V3 0.000000 1.000000 0.000000
>>> rotate (qj :: QuatM) $ V3 0 0 1
V3 0.000000 0.000000 -1.000000
>>> qj >< qk
Quaternion 0 (V3 1 0 0)

qk :: Unital a => Quaternion a Source #

The k quaternion.

Represents a \( \pi \) radian rotation about the z axis.

>>> rotate (qk :: QuatM) $ V3 1 0 0
V3 -1.000000 0.000000 0.000000
>>> rotate (qk :: QuatM) $ V3 0 1 0
V3 0.000000 -1.000000 0.000000
>>> rotate (qk :: QuatM) $ V3 0 0 1
V3 0.000000 0.000000 1.000000
>>> qk >< qi
Quaternion 0 (V3 0 1 0)
>>> qi >< qj >< qk
Quaternion (-1) (V3 0 0 0)

q00 :: Field a => Quaternion a Source #

Identity (empty) rotation.

All rotations written according to the right-hand rule.

q01 :: Field a => Quaternion a Source #

A \( \pi/2 \) radian rotation about the y axis.

>>> m33 0 0 1 0 1 0 (-1) 0 0 #> V3 0 1 0 :: V3 Micro
V3 0.000000 1.000000 0.000000

q02 :: Field a => Quaternion a Source #

A \( \pi \) radian rotation about the y axis.

q03 :: Field a => Quaternion a Source #

A \( 3 \pi/2 \) radian rotation about the y axis.

q04 :: Field a => Quaternion a Source #

A \( \pi/2 \) radian rotation about the z axis.

>>> rotate (q04 :: QuatM) $ V3 0 0 1
V3 0.000000 0.000000 0.999996
>>> rotate (q04 :: QuatM) $ V3 1 1 0
V3 -0.999998 0.999997 0.000000

q05 :: Field a => Quaternion a Source #

A \( 2 \pi/3 \) radian rotation about the x-y-z axis.

 q05 ≡ q01 >< q04
>>> rotate (q05 :: QuatM) $ V3 1 1 1
V3 1.000000 1.000000 1.000000
>>> cosAngle q05 (fmap (irt2><) $ V3 1 (-1) 0)
-0.499999999991
>>> cosAngle q05 (fmap (irt2><) $ V3 0 1 (-1))
-0.499999999991
>>> cosAngle q05 (fmap (irt2><irt3><) $ V3 1 (-2) 1)
-0.499999999993

q06 :: Field a => Quaternion a Source #

A \( \pi \) radian rotation about the x-y axis.

 q06 ≡ q02 >< q04
>>> rotate (q06 :: QuatM) $ V3 1 1 0
V3 0.999997 0.999997 0.000000
>>> rotate (q06 :: QuatM) $ V3 0 0 1
V3 0.000000 0.000000 -0.999997

q07 :: Field a => Quaternion a Source #

A \( 2 \pi/3 \) radian rotation about the (-x)-(-y)-z axis.

Equivalent to a \( 3 \pi/2 \) radian rotation about y axis, followed by \( \pi/2 \) radian rotation about z axis:

 q07 ≡ q03 >< q04
>>> rotate (q07 :: QuatM) $ V3 1 1 (-1)
V3 1.000000 1.000000 -1.000000
>>> cosAngle q07 ((irt2><irt3><) <$> V3 (-1) 2 1)
-0.499999999993

q08 :: Field a => Quaternion a Source #

A \( 3 \pi/2 \) radian rotation about the z axis.

>>> rotate (q08 :: QuatM) $ V3 0 0 1
V3 0.000000 0.000000 0.999996
>>> rotate (q08 :: QuatM) $ V3 1 1 0
V3 0.999997 -0.999997 0.000000

q09 :: Field a => Quaternion a Source #

A \( 2 \pi/3 \) radian rotation about the (-x)-y-(-z) axis.

 q09 ≡ q01 >< q08
>>> rotate (q09 :: QuatM) $ V3 1 (-1) 1
V3 1.000000 -1.000000 1.000000
>>> cosAngle q09 ((irt2><irt3><) <$> V3 1 2 1)
-0.499999999993

q10 :: Field a => Quaternion a Source #

 q10 ≡ q02 >< q08

q11 :: Field a => Quaternion a Source #

A \( 2 \pi/3 \) radian rotation about the x-(-y)-(-z) axis.

 q11 ≡ q03 >< q08
>>> rotate (q11 :: QuatM) $ V3 (-1) 1 1
V3 1.000000 1.000000 -1.000000
>>> cosAngle q11 ((irt2><irt3><) <$> V3 1 2 (-1))
-0.499999999993

q12 :: Field a => Quaternion a Source #

A \( \pi/2 \) radian rotation about the x axis.

>>> rotate (q12 :: QuatM) $ V3 1 0 0
V3 0.999996 0.000000 0.000000
>>> rotate (q12 :: QuatM) $ V3 0 1 1
V3 0.000000 -0.999998 0.999997

q13 :: Field a => Quaternion a Source #

 q13 ≡ q01 >< q12

q14 :: Field a => Quaternion a Source #

 q14 ≡ q02 >< q12

q15 :: Field a => Quaternion a Source #

 q15 ≡ q03 >< q12

q16 :: Field a => Quaternion a Source #

A \( \pi \) radian rotation about the x axis.

λ> rotate (q16 :: QuatM) $ V3 1 0 0 V3 1.000000 0.000000 0.000000 λ> rotate (q16 :: QuatM) $ V3 0 1 1 V3 0.000000 -1.000000 -1.000000

q17 :: Field a => Quaternion a Source #

 q17 ≡ q01 >< q16

q18 :: Field a => Quaternion a Source #

 q18 ≡ q02 >< q16

q19 :: Field a => Quaternion a Source #

 q19 ≡ q03 >< q16

q20 :: Field a => Quaternion a Source #

A \( 3 \pi/2 \) radian rotation about the x axis.

>>> rotate (q20 :: QuatM) $ V3 1 0 0
V3 0.999996 0.000000 0.000000
>>> rotate (q20 :: QuatM) $ V3 0 1 1
V3 0.000000 0.999997 -0.999997

q21 :: Field a => Quaternion a Source #

 q21 ≡ q01 >< q20

q22 :: Field a => Quaternion a Source #

 q22 ≡ q02 >< q20

q23 :: Field a => Quaternion a Source #

 q23 ≡ q03 >< q20

irt2 :: Field a => a Source #

irt3 :: Field a => a Source #

divq :: Semiring a => (a -> a -> a) -> (a -> a) -> Quaternion a -> Quaternion a -> Quaternion a Source #