{-# language QuasiQuotes #-}
module Physics.Orbit.StateVectors
(
StateVectors(..)
, Position
, Velocity
, stateVectorsAtTrueAnomaly
, positionAtTrueAnomaly
, positionInPlaneAtTrueAnomaly
, velocityAtTrueAnomaly
, velocityInPlaneAtTrueAnomaly
, elementsFromStateVectors
, eccentricityVector
, trueAnomalyAtPosition
, orbitalPlaneQuaternion
, rotateToPlane
, rotateFromPlane
, flightPathAngleAtTrueAnomaly
, specificAngularMomentumVector
) where
import Control.Lens.Operators ( (^.) )
import Data.Coerce
import Data.Constants.Mechanics.Extra
import Data.Metrology
import Data.Metrology.Extra
import Data.Metrology.Unsafe ( Qu(..) )
import Data.Units.SI.Parser
import Linear.Conjugate
import Linear.Quaternion
import Linear.V3
import Physics.Orbit
type Position a = V3 (Distance a)
type Velocity a = V3 (Speed a)
data StateVectors a = StateVectors
{ StateVectors a -> Position a
position :: Position a
, StateVectors a -> Velocity a
velocity :: Velocity a
}
deriving (Int -> StateVectors a -> ShowS
[StateVectors a] -> ShowS
StateVectors a -> String
(Int -> StateVectors a -> ShowS)
-> (StateVectors a -> String)
-> ([StateVectors a] -> ShowS)
-> Show (StateVectors a)
forall a. Show a => Int -> StateVectors a -> ShowS
forall a. Show a => [StateVectors a] -> ShowS
forall a. Show a => StateVectors a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [StateVectors a] -> ShowS
$cshowList :: forall a. Show a => [StateVectors a] -> ShowS
show :: StateVectors a -> String
$cshow :: forall a. Show a => StateVectors a -> String
showsPrec :: Int -> StateVectors a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> StateVectors a -> ShowS
Show, StateVectors a -> StateVectors a -> Bool
(StateVectors a -> StateVectors a -> Bool)
-> (StateVectors a -> StateVectors a -> Bool)
-> Eq (StateVectors a)
forall a. Eq a => StateVectors a -> StateVectors a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StateVectors a -> StateVectors a -> Bool
$c/= :: forall a. Eq a => StateVectors a -> StateVectors a -> Bool
== :: StateVectors a -> StateVectors a -> Bool
$c== :: forall a. Eq a => StateVectors a -> StateVectors a -> Bool
Eq)
positionAtTrueAnomaly
:: (Conjugate a, RealFloat a) => Orbit a -> Angle a -> Position a
positionAtTrueAnomaly :: Orbit a -> Angle a -> Position a
positionAtTrueAnomaly o :: Orbit a
o = Orbit a
-> V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
-> V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
forall a (u :: [Factor *]) (l :: LCSU *).
(Conjugate a, RealFloat a) =>
Orbit a -> V3 (Qu u l a) -> V3 (Qu u l a)
rotateFromPlane Orbit a
o (V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
-> V3 (Qu '[ 'F Length One] 'DefaultLCSU a))
-> (Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> V3 (Qu '[ 'F Length One] 'DefaultLCSU a))
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Orbit a -> Angle a -> Position a
forall a. (Ord a, Floating a) => Orbit a -> Angle a -> Position a
positionInPlaneAtTrueAnomaly Orbit a
o
positionInPlaneAtTrueAnomaly
:: (Ord a, Floating a) => Orbit a -> Angle a -> Position a
positionInPlaneAtTrueAnomaly :: Orbit a -> Angle a -> Position a
positionInPlaneAtTrueAnomaly o :: Orbit a
o ν :: Angle a
ν = V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
Position a
r
where
radius :: Distance a
radius = Orbit a -> Angle a -> Distance a
forall a. (Ord a, Floating a) => Orbit a -> Angle a -> Distance a
radiusAtTrueAnomaly Orbit a
o Angle a
ν
r :: V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
r = Qu '[ 'F Length One] 'DefaultLCSU a
-> Qu '[ 'F Length One] 'DefaultLCSU a
-> Qu '[ 'F Length One] 'DefaultLCSU a
-> V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
forall a. a -> a -> a -> V3 a
V3 (Angle a -> Unitless a
forall a. Floating a => Angle a -> Unitless a
qCos Angle a
ν Qu '[] 'DefaultLCSU a
-> Qu '[ 'F Length One] 'DefaultLCSU a
-> Qu (Normalize ('[] @+ '[ 'F Length One])) 'DefaultLCSU a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[ 'F Length One] 'DefaultLCSU a
Distance a
radius) (Angle a -> Unitless a
forall a. Floating a => Angle a -> Unitless a
qSin Angle a
ν Qu '[] 'DefaultLCSU a
-> Qu '[ 'F Length One] 'DefaultLCSU a
-> Qu (Normalize ('[] @+ '[ 'F Length One])) 'DefaultLCSU a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[ 'F Length One] 'DefaultLCSU a
Distance a
radius) Qu '[ 'F Length One] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero
velocityAtTrueAnomaly
:: (Conjugate a, RealFloat a) => Orbit a -> Angle a -> Velocity a
velocityAtTrueAnomaly :: Orbit a -> Angle a -> Velocity a
velocityAtTrueAnomaly o :: Orbit a
o = Orbit a
-> V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall a (u :: [Factor *]) (l :: LCSU *).
(Conjugate a, RealFloat a) =>
Orbit a -> V3 (Qu u l a) -> V3 (Qu u l a)
rotateFromPlane Orbit a
o (V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a))
-> (Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a))
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Orbit a -> Angle a -> Velocity a
forall a. (Ord a, Floating a) => Orbit a -> Angle a -> Velocity a
velocityInPlaneAtTrueAnomaly Orbit a
o
velocityInPlaneAtTrueAnomaly
:: (Ord a, Floating a) => Orbit a -> Angle a -> Velocity a
velocityInPlaneAtTrueAnomaly :: Orbit a -> Angle a -> Velocity a
velocityInPlaneAtTrueAnomaly o :: Orbit a
o ν :: Angle a
ν = V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
Velocity a
v
where
μ :: Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
μ = Orbit a
-> Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
forall a.
Orbit a
-> Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
primaryGravitationalParameter Orbit a
o
e :: Unitless a
e = Orbit a -> Unitless a
forall a. Orbit a -> Unitless a
eccentricity Orbit a
o
r :: Distance a
r = Orbit a -> Angle a -> Distance a
forall a. (Ord a, Floating a) => Orbit a -> Angle a -> Distance a
radiusAtTrueAnomaly Orbit a
o Angle a
ν
h :: Quantity ((Meter :^ Succ (Succ 'Zero)) :* (Second :^ Pred 'Zero)) a
h = Orbit a
-> Quantity
((Meter :^ Succ (Succ 'Zero)) :* (Second :^ Pred 'Zero)) a
forall a.
Floating a =>
Orbit a
-> Quantity
((Meter :^ Succ (Succ 'Zero)) :* (Second :^ Pred 'Zero)) a
specificAngularMomentum Orbit a
o
cosν :: Unitless a
cosν = Angle a -> Unitless a
forall a. Floating a => Angle a -> Unitless a
qCos Angle a
ν
sinν :: Unitless a
sinν = Angle a -> Unitless a
forall a. Floating a => Angle a -> Unitless a
qSin Angle a
ν
vr :: Qu
(Normalize
('[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
vr = Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
μ Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
-> Qu '[] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] @+ '[]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[] 'DefaultLCSU a
Unitless a
e Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
-> Qu '[] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] @+ '[]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[] 'DefaultLCSU a
Unitless a
sinν Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Fractional n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n
|/| Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
Quantity ((Meter :^ Succ (Succ 'Zero)) :* (Second :^ Pred 'Zero)) a
h
vtA :: Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)] @- '[ 'F Length One]))
'DefaultLCSU
a
vtA = Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
Quantity ((Meter :^ Succ (Succ 'Zero)) :* (Second :^ Pred 'Zero)) a
h Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length One] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)] @- '[ 'F Length One]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Fractional n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n
|/| Qu '[ 'F Length One] 'DefaultLCSU a
Distance a
r
v :: V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
v = Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall a. a -> a -> a -> V3 a
V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
Qu
(Normalize
('[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
vr Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[] 'DefaultLCSU a
-> Qu
(Normalize ('[ 'F Length One, 'F Time ('P 'Zero)] @+ '[]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[] 'DefaultLCSU a
Unitless a
cosν Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
forall (d1 :: [Factor *]) (d2 :: [Factor *]) n (l :: LCSU *).
(d1 @~ d2, Num n) =>
Qu d1 l n -> Qu d2 l n -> Qu d1 l n
|-| Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)] @- '[ 'F Length One]))
'DefaultLCSU
a
vtA Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[] 'DefaultLCSU a
-> Qu
(Normalize ('[ 'F Length One, 'F Time ('P 'Zero)] @+ '[]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[] 'DefaultLCSU a
Unitless a
sinν) (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
Qu
(Normalize
('[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
vr Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[] 'DefaultLCSU a
-> Qu
(Normalize ('[ 'F Length One, 'F Time ('P 'Zero)] @+ '[]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[] 'DefaultLCSU a
Unitless a
sinν Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
forall (d1 :: [Factor *]) (d2 :: [Factor *]) n (l :: LCSU *).
(d1 @~ d2, Num n) =>
Qu d1 l n -> Qu d2 l n -> Qu d1 l n
|+| Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)] @- '[ 'F Length One]))
'DefaultLCSU
a
vtA Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[] 'DefaultLCSU a
-> Qu
(Normalize ('[ 'F Length One, 'F Time ('P 'Zero)] @+ '[]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[] 'DefaultLCSU a
Unitless a
cosν) Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero
stateVectorsAtTrueAnomaly
:: (Conjugate a, RealFloat a) => Orbit a -> Angle a -> StateVectors a
stateVectorsAtTrueAnomaly :: Orbit a -> Angle a -> StateVectors a
stateVectorsAtTrueAnomaly o :: Orbit a
o ν :: Angle a
ν = Position a -> Velocity a -> StateVectors a
forall a. Position a -> Velocity a -> StateVectors a
StateVectors Position a
r Velocity a
v
where
r :: Position a
r = Orbit a -> Angle a -> Position a
forall a.
(Conjugate a, RealFloat a) =>
Orbit a -> Angle a -> Position a
positionAtTrueAnomaly Orbit a
o Angle a
ν
v :: Velocity a
v = Orbit a -> Angle a -> Velocity a
forall a.
(Conjugate a, RealFloat a) =>
Orbit a -> Angle a -> Velocity a
velocityAtTrueAnomaly Orbit a
o Angle a
ν
elementsFromStateVectors
:: (Ord a, Floating a, Conjugate a, RealFloat a, Show a)
=> Quantity [si| m^3 s^-2 |] a
-> StateVectors a
-> (Orbit a, Angle a)
elementsFromStateVectors :: Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
-> StateVectors a -> (Orbit a, Angle a)
elementsFromStateVectors μ :: Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
μ sv :: StateVectors a
sv@(StateVectors r :: Position a
r v :: Velocity a
v) = (Orbit a
o, Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
Angle a
ν)
where
o :: Orbit a
o = Unitless a
-> Distance a
-> InclinationSpecifier a
-> PeriapsisSpecifier a
-> Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
-> Orbit a
forall a.
Unitless a
-> Distance a
-> InclinationSpecifier a
-> PeriapsisSpecifier a
-> Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
-> Orbit a
Orbit Qu '[] 'DefaultLCSU a
Unitless a
e Qu ('F Length One : Normalize '[ 'F Time 'Zero]) 'DefaultLCSU a
Distance a
q InclinationSpecifier a
inclinationSpecifier' PeriapsisSpecifier a
periapsisSpecifier' Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
μ
h :: V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h = StateVectors a
-> V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
forall a.
Num a =>
StateVectors a
-> V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
specificAngularMomentumVector StateVectors a
sv
n :: V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
n = Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> V3
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall a. a -> a -> a -> V3 a
V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall n (d :: [Factor *]) (l :: LCSU *).
Num n =>
Qu d l n -> Qu d l n
qNegate (V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall (t :: * -> *) a. R2 t => Lens' (t a) a
_y)) (V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall (t :: * -> *) a. R1 t => Lens' (t a) a
_x) Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero
e' :: V3 (Unitless a)
e' = Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
-> StateVectors a -> V3 (Unitless a)
forall a.
Floating a =>
Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
-> StateVectors a -> V3 (Unitless a)
eccentricityVector Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
μ StateVectors a
sv
e :: Qu '[] 'DefaultLCSU a
e = V3 (Qu '[] 'DefaultLCSU a) -> Qu '[] 'DefaultLCSU a
forall (u :: [Factor *]) (l :: LCSU *) a.
Floating a =>
V3 (Qu u l a) -> Qu u l a
qNorm V3 (Qu '[] 'DefaultLCSU a)
V3 (Unitless a)
e'
eNorm :: V3 (Qu '[] 'DefaultLCSU a)
eNorm = (Qu '[] 'DefaultLCSU a -> Qu '[] 'DefaultLCSU a
forall a. Fractional a => a -> a
recip Qu '[] 'DefaultLCSU a
e Qu '[] 'DefaultLCSU a
-> Qu '[] 'DefaultLCSU a -> Qu '[] 'DefaultLCSU a
forall a. Num a => a -> a -> a
*) (Qu '[] 'DefaultLCSU a -> Qu '[] 'DefaultLCSU a)
-> V3 (Qu '[] 'DefaultLCSU a) -> V3 (Qu '[] 'DefaultLCSU a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> V3 (Qu '[] 'DefaultLCSU a)
V3 (Unitless a)
e'
aInv :: Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a
aInv = (2 Qu '[] 'DefaultLCSU a
-> Qu '[ 'F Length One] 'DefaultLCSU a
-> Qu (Normalize ('[] @- '[ 'F Length One])) 'DefaultLCSU a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Fractional n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n
|/| V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
-> Qu '[ 'F Length One] 'DefaultLCSU a
forall (u :: [Factor *]) (l :: LCSU *) a.
Floating a =>
V3 (Qu u l a) -> Qu u l a
qNorm V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
Position a
r) Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a
forall (d1 :: [Factor *]) (d2 :: [Factor *]) n (l :: LCSU *).
(d1 @~ d2, Num n) =>
Qu d1 l n -> Qu d2 l n -> Qu d1 l n
|-| (V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu
(Normalize
('[ 'F Length One, 'F Time ('P 'Zero)]
@@+ Reorder
'[ 'F Length One, 'F Time ('P 'Zero)]
'[ 'F Length One, 'F Time ('P 'Zero)]))
'DefaultLCSU
a
forall (u :: [Factor *]) (l :: LCSU *) a.
Num a =>
V3 (Qu u l a) -> Qu (Normalize (u @@+ Reorder u u)) l a
qQuadrance V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
Velocity a
v Qu '[ 'F Length ('S One), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
-> Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P ('P 'Zero))]
@- '[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Fractional n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n
|/| Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
μ)
a :: Qu (Normalize ('[] @- '[ 'F Length ('P 'Zero)])) 'DefaultLCSU a
a = Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a
-> Qu (Normalize ('[] @- '[ 'F Length ('P 'Zero)])) 'DefaultLCSU a
forall (u :: [Factor *]) (l :: LCSU *) a.
Fractional a =>
Qu u l a -> Qu (Normalize ('[] @- u)) l a
qRecip Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a
aInv
q :: Qu ('F Length One : Normalize '[ 'F Time 'Zero]) 'DefaultLCSU a
q = if Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a
aInv Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a -> Bool
forall a. Eq a => a -> a -> Bool
== Qu '[ 'F Length ('P 'Zero)] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero
then V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)]
@@+ Reorder
'[ 'F Length ('S One), 'F Time ('P 'Zero)]
'[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
forall (u :: [Factor *]) (l :: LCSU *) a.
Num a =>
V3 (Qu u l a) -> Qu (Normalize (u @@+ Reorder u u)) l a
qQuadrance V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h Qu
'[ 'F Length ('S ('S ('S One))), 'F Time ('P ('P 'Zero))]
'DefaultLCSU
a
-> Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length ('S ('S ('S One))), 'F Time ('P ('P 'Zero))]
@- '[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Fractional n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n
|/| (2 Qu '[] 'DefaultLCSU a
-> Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
-> Qu
(Normalize
('[] @+ '[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
μ)
else Qu '[ 'F Length One] 'DefaultLCSU a
Qu (Normalize ('[] @- '[ 'F Length ('P 'Zero)])) 'DefaultLCSU a
a Qu '[ 'F Length One] 'DefaultLCSU a
-> Qu '[] 'DefaultLCSU a
-> Qu (Normalize ('[ 'F Length One] @+ '[])) 'DefaultLCSU a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| (1 Qu '[] 'DefaultLCSU a
-> Qu '[] 'DefaultLCSU a -> Qu '[] 'DefaultLCSU a
forall a. Num a => a -> a -> a
- Qu '[] 'DefaultLCSU a
e)
ν :: Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
ν = if Qu '[] 'DefaultLCSU a
e Qu '[] 'DefaultLCSU a -> Qu '[] 'DefaultLCSU a -> Bool
forall a. Eq a => a -> a -> Bool
== Qu '[] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero
then
Orbit a -> Position a -> Angle a
forall a.
(Conjugate a, RealFloat a) =>
Orbit a -> Position a -> Angle a
trueAnomalyAtPosition Orbit a
o Position a
r
else
let cosν :: Qu (Normalize ('[] @@+ Reorder '[] '[])) 'DefaultLCSU a
cosν = V3 (Qu '[] 'DefaultLCSU a)
eNorm V3 (Qu '[] 'DefaultLCSU a)
-> V3 (Qu '[] 'DefaultLCSU a)
-> Qu (Normalize ('[] @@+ Reorder '[] '[])) 'DefaultLCSU a
forall (u :: [Factor *]) (v :: [Factor *]) (l :: LCSU *) a.
Num a =>
V3 (Qu u l a)
-> V3 (Qu v l a) -> Qu (Normalize (u @@+ Reorder v u)) l a
`qDot` V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
-> V3
(Qu
(Normalize
(Normalize ('[] @- '[ 'F Length One])
@@+ Reorder
'[ 'F Length One] (Normalize ('[] @- '[ 'F Length One]))))
'DefaultLCSU
a)
forall n (b :: [Factor *]) (l :: LCSU *).
Floating n =>
V3 (Qu b l n)
-> V3
(Qu
(Normalize
(Normalize ('[] @- b) @@+ Reorder b (Normalize ('[] @- b))))
l
n)
qNormalize V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
Position a
r
in if V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
Position a
r V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
-> V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu
(Normalize
('[ 'F Length One]
@@+ Reorder
'[ 'F Length One, 'F Time ('P 'Zero)] '[ 'F Length One]))
'DefaultLCSU
a
forall (u :: [Factor *]) (v :: [Factor *]) (l :: LCSU *) a.
Num a =>
V3 (Qu u l a)
-> V3 (Qu v l a) -> Qu (Normalize (u @@+ Reorder v u)) l a
`qDot` V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
Velocity a
v Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Bool
forall a. Ord a => a -> a -> Bool
>= Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero then Unitless a -> Angle a
forall a. Floating a => Unitless a -> Angle a
qArcCos Unitless a
Qu (Normalize ('[] @@+ Reorder '[] '[])) 'DefaultLCSU a
cosν else Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a. Floating a => PlaneAngle a
turn Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (d1 :: [Factor *]) (d2 :: [Factor *]) n (l :: LCSU *).
(d1 @~ d2, Num n) =>
Qu d1 l n -> Qu d2 l n -> Qu d1 l n
|-| Unitless a -> Angle a
forall a. Floating a => Unitless a -> Angle a
qArcCos Unitless a
Qu (Normalize ('[] @@+ Reorder '[] '[])) 'DefaultLCSU a
cosν
inclinationSpecifier' :: InclinationSpecifier a
inclinationSpecifier' =
let i :: Angle a
i = Unitless a -> Angle a
forall a. Floating a => Unitless a -> Angle a
qArcCos ((V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall (t :: * -> *) a. R3 t => Lens' (t a) a
_z) Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Fractional n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n
|/| V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall (u :: [Factor *]) (l :: LCSU *) a.
Floating a =>
V3 (Qu u l a) -> Qu u l a
qNorm V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h)
cosΩ :: Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
cosΩ = V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
n V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall (t :: * -> *) a. R1 t => Lens' (t a) a
_x Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Fractional n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n
|/| V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall (u :: [Factor *]) (l :: LCSU *) a.
Floating a =>
V3 (Qu u l a) -> Qu u l a
qNorm V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
n
_Ω :: Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
_Ω = if V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
n V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall (t :: * -> *) a. R2 t => Lens' (t a) a
_y Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Bool
forall a. Ord a => a -> a -> Bool
>= Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero then Unitless a -> Angle a
forall a. Floating a => Unitless a -> Angle a
qArcCos Unitless a
Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
cosΩ else Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a. Floating a => PlaneAngle a
turn Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (d1 :: [Factor *]) (d2 :: [Factor *]) n (l :: LCSU *).
(d1 @~ d2, Num n) =>
Qu d1 l n -> Qu d2 l n -> Qu d1 l n
|-| Unitless a -> Angle a
forall a. Floating a => Unitless a -> Angle a
qArcCos Unitless a
Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
cosΩ
in if V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall (t :: * -> *) a. R1 t => Lens' (t a) a
_x Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Bool
forall a. Eq a => a -> a -> Bool
== Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero Bool -> Bool -> Bool
&& V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
(V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a))
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
forall (t :: * -> *) a. R2 t => Lens' (t a) a
_y Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Bool
forall a. Eq a => a -> a -> Bool
== Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero
then InclinationSpecifier a
forall a. InclinationSpecifier a
NonInclined
else Angle a -> Angle a -> InclinationSpecifier a
forall a. Angle a -> Angle a -> InclinationSpecifier a
Inclined Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
Angle a
_Ω Angle a
i
periapsisSpecifier' :: PeriapsisSpecifier a
periapsisSpecifier' =
let cosω :: Qu '[] 'DefaultLCSU a
cosω = case InclinationSpecifier a
inclinationSpecifier' of
Inclined _ _ -> V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> V3
(Qu
(Normalize
(Normalize ('[] @- '[ 'F Length ('S One), 'F Time ('P 'Zero)])
@@+ Reorder
'[ 'F Length ('S One), 'F Time ('P 'Zero)]
(Normalize ('[] @- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))))
'DefaultLCSU
a)
forall n (b :: [Factor *]) (l :: LCSU *).
Floating n =>
V3 (Qu b l n)
-> V3
(Qu
(Normalize
(Normalize ('[] @- b) @@+ Reorder b (Normalize ('[] @- b))))
l
n)
qNormalize V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
n V3 (Qu '[] 'DefaultLCSU a)
-> V3 (Qu '[] 'DefaultLCSU a)
-> Qu (Normalize ('[] @@+ Reorder '[] '[])) 'DefaultLCSU a
forall (u :: [Factor *]) (v :: [Factor *]) (l :: LCSU *) a.
Num a =>
V3 (Qu u l a)
-> V3 (Qu v l a) -> Qu (Normalize (u @@+ Reorder v u)) l a
`qDot` V3 (Qu '[] 'DefaultLCSU a)
eNorm
NonInclined -> V3 (Qu '[] 'DefaultLCSU a)
eNorm V3 (Qu '[] 'DefaultLCSU a)
-> Getting
(Qu '[] 'DefaultLCSU a)
(V3 (Qu '[] 'DefaultLCSU a))
(Qu '[] 'DefaultLCSU a)
-> Qu '[] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[] 'DefaultLCSU a)
(V3 (Qu '[] 'DefaultLCSU a))
(Qu '[] 'DefaultLCSU a)
forall (t :: * -> *) a. R1 t => Lens' (t a) a
_x
ω :: Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
ω = case InclinationSpecifier a
inclinationSpecifier' of
Inclined _ _ ->
if (V3 (Qu '[] 'DefaultLCSU a)
V3 (Unitless a)
e' V3 (Qu '[] 'DefaultLCSU a)
-> Getting
(Qu '[] 'DefaultLCSU a)
(V3 (Qu '[] 'DefaultLCSU a))
(Qu '[] 'DefaultLCSU a)
-> Qu '[] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[] 'DefaultLCSU a)
(V3 (Qu '[] 'DefaultLCSU a))
(Qu '[] 'DefaultLCSU a)
forall (t :: * -> *) a. R3 t => Lens' (t a) a
_z) Qu '[] 'DefaultLCSU a -> Qu '[] 'DefaultLCSU a -> Bool
forall a. Ord a => a -> a -> Bool
>= Qu '[] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero then Unitless a -> Angle a
forall a. Floating a => Unitless a -> Angle a
qArcCos Qu '[] 'DefaultLCSU a
Unitless a
cosω else Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a. Floating a => PlaneAngle a
turn Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (d1 :: [Factor *]) (d2 :: [Factor *]) n (l :: LCSU *).
(d1 @~ d2, Num n) =>
Qu d1 l n -> Qu d2 l n -> Qu d1 l n
|-| Unitless a -> Angle a
forall a. Floating a => Unitless a -> Angle a
qArcCos Qu '[] 'DefaultLCSU a
Unitless a
cosω
NonInclined ->
let sinω :: Qu '[] 'DefaultLCSU a
sinω = V3 (Qu '[] 'DefaultLCSU a)
eNorm V3 (Qu '[] 'DefaultLCSU a)
-> Getting
(Qu '[] 'DefaultLCSU a)
(V3 (Qu '[] 'DefaultLCSU a))
(Qu '[] 'DefaultLCSU a)
-> Qu '[] 'DefaultLCSU a
forall s a. s -> Getting a s a -> a
^. Getting
(Qu '[] 'DefaultLCSU a)
(V3 (Qu '[] 'DefaultLCSU a))
(Qu '[] 'DefaultLCSU a)
forall (t :: * -> *) a. R2 t => Lens' (t a) a
_y in Unitless a -> Unitless a -> Angle a
forall a. RealFloat a => Unitless a -> Unitless a -> Angle a
qArcTan2 Qu '[] 'DefaultLCSU a
Unitless a
sinω Qu '[] 'DefaultLCSU a
Unitless a
cosω Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a (u :: [Factor *]) (l :: LCSU *).
Real a =>
Qu u l a -> Qu u l a -> Qu u l a
`mod'` Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a. Floating a => PlaneAngle a
turn
in if Qu '[] 'DefaultLCSU a
e Qu '[] 'DefaultLCSU a -> Qu '[] 'DefaultLCSU a -> Bool
forall a. Eq a => a -> a -> Bool
== Qu '[] 'DefaultLCSU a
forall n (dimspec :: [Factor *]) (l :: LCSU *).
Num n =>
Qu dimspec l n
zero then PeriapsisSpecifier a
forall a. PeriapsisSpecifier a
Circular else Angle a -> PeriapsisSpecifier a
forall a. Angle a -> PeriapsisSpecifier a
Eccentric Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
Angle a
ω
trueAnomalyAtPosition
:: (Conjugate a, RealFloat a) => Orbit a -> Position a -> Angle a
trueAnomalyAtPosition :: Orbit a -> Position a -> Angle a
trueAnomalyAtPosition o :: Orbit a
o r :: Position a
r = Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
Angle a
ν
where
V3 (Qu x :: a
x) (Qu y :: a
y) _ = Orbit a
-> V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
-> V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
forall a (u :: [Factor *]) (l :: LCSU *).
(Conjugate a, RealFloat a) =>
Orbit a -> V3 (Qu u l a) -> V3 (Qu u l a)
rotateToPlane Orbit a
o V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
Position a
r
ν :: Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
ν = a -> a -> a
forall a. RealFloat a => a -> a -> a
atan2 a
y a
x a -> Radian -> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
n -> unit -> Qu dim 'DefaultLCSU n
% [si|rad|]
specificAngularMomentumVector
:: Num a => StateVectors a -> V3 (Quantity [si|m^2 / s|] a)
specificAngularMomentumVector :: StateVectors a
-> V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
specificAngularMomentumVector (StateVectors r :: Position a
r v :: Velocity a
v) = V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
Position a
r V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
-> V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> V3
(Qu
(Normalize
('[ 'F Length One]
@@+ Reorder
'[ 'F Length One, 'F Time ('P 'Zero)] '[ 'F Length One]))
'DefaultLCSU
a)
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
V3 (Qu a l n)
-> V3 (Qu b l n) -> V3 (Qu (Normalize (a @@+ Reorder b a)) l n)
`qCross` V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
Velocity a
v
eccentricityVector
:: Floating a
=> Quantity [si| m^3 s^-2 |] a
-> StateVectors a
-> V3 (Unitless a)
eccentricityVector :: Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
-> StateVectors a -> V3 (Unitless a)
eccentricityVector μ :: Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
μ sv :: StateVectors a
sv@(StateVectors r :: Position a
r v :: Velocity a
v) = V3 (Qu '[] 'DefaultLCSU a)
V3 (Unitless a)
e
where
e :: V3 (Qu '[] 'DefaultLCSU a)
e = (V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
Velocity a
v V3 (Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> V3
(Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
-> V3
(Qu
(Normalize
('[ 'F Length One, 'F Time ('P 'Zero)]
@@+ Reorder
'[ 'F Length ('S One), 'F Time ('P 'Zero)]
'[ 'F Length One, 'F Time ('P 'Zero)]))
'DefaultLCSU
a)
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
V3 (Qu a l n)
-> V3 (Qu b l n) -> V3 (Qu (Normalize (a @@+ Reorder b a)) l n)
`qCross` V3 (Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a)
V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h) V3
(Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]
'DefaultLCSU
a)
-> Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
-> V3
(Qu
(Normalize
(Normalize
('[] @- '[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))])
@@+ Reorder
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]
(Normalize
('[] @- '[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))]))))
'DefaultLCSU
a)
forall (f :: * -> *) n (b :: [Factor *]) (l :: LCSU *)
(u :: [Factor *]).
(Functor f, Fractional n) =>
f (Qu b l n)
-> Qu u l n
-> f (Qu
(Normalize
(Normalize ('[] @- u) @@+ Reorder b (Normalize ('[] @- u))))
l
n)
|^/| Qu
'[ 'F Length ('S ('S One)), 'F Time ('P ('P 'Zero))] 'DefaultLCSU a
Quantity
((Meter :^ Succ (Succ (Succ 'Zero)))
:* (Second :^ Pred (Pred 'Zero)))
a
μ V3 (Qu '[] 'DefaultLCSU a)
-> V3 (Qu '[] 'DefaultLCSU a) -> V3 (Qu '[] 'DefaultLCSU a)
forall (f :: * -> *) (u :: [Factor *]) (l :: LCSU *) a.
(Additive f, Applicative f, Num a) =>
f (Qu u l a) -> f (Qu u l a) -> f (Qu u l a)
|^-^| V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
-> V3
(Qu
(Normalize
(Normalize ('[] @- '[ 'F Length One])
@@+ Reorder
'[ 'F Length One] (Normalize ('[] @- '[ 'F Length One]))))
'DefaultLCSU
a)
forall n (b :: [Factor *]) (l :: LCSU *).
Floating n =>
V3 (Qu b l n)
-> V3
(Qu
(Normalize
(Normalize ('[] @- b) @@+ Reorder b (Normalize ('[] @- b))))
l
n)
qNormalize V3 (Qu '[ 'F Length One] 'DefaultLCSU a)
Position a
r
h :: V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
h = StateVectors a
-> V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
forall a.
Num a =>
StateVectors a
-> V3 (Quantity ((Meter :^ Succ (Succ 'Zero)) :/ Second) a)
specificAngularMomentumVector StateVectors a
sv
rotateFromPlane
:: (Conjugate a, RealFloat a)
=> Orbit a
-> V3 (Qu u l a)
-> V3 (Qu u l a)
rotateFromPlane :: Orbit a -> V3 (Qu u l a) -> V3 (Qu u l a)
rotateFromPlane = Quaternion a -> V3 (Qu u l a) -> V3 (Qu u l a)
forall a (q :: * -> *).
(Coercible (q a) a, Conjugate a, RealFloat a) =>
Quaternion a -> V3 (q a) -> V3 (q a)
qRotate (Quaternion a -> V3 (Qu u l a) -> V3 (Qu u l a))
-> (Orbit a -> Quaternion a)
-> Orbit a
-> V3 (Qu u l a)
-> V3 (Qu u l a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Orbit a -> Quaternion a
forall a. RealFloat a => Orbit a -> Quaternion a
orbitalPlaneQuaternion
rotateToPlane
:: (Conjugate a, RealFloat a) => Orbit a -> V3 (Qu u l a) -> V3 (Qu u l a)
rotateToPlane :: Orbit a -> V3 (Qu u l a) -> V3 (Qu u l a)
rotateToPlane = Quaternion a -> V3 (Qu u l a) -> V3 (Qu u l a)
forall a (q :: * -> *).
(Coercible (q a) a, Conjugate a, RealFloat a) =>
Quaternion a -> V3 (q a) -> V3 (q a)
qRotate (Quaternion a -> V3 (Qu u l a) -> V3 (Qu u l a))
-> (Orbit a -> Quaternion a)
-> Orbit a
-> V3 (Qu u l a)
-> V3 (Qu u l a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Quaternion a -> Quaternion a
forall a. Conjugate a => a -> a
conjugate (Quaternion a -> Quaternion a)
-> (Orbit a -> Quaternion a) -> Orbit a -> Quaternion a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Orbit a -> Quaternion a
forall a. RealFloat a => Orbit a -> Quaternion a
orbitalPlaneQuaternion
orbitalPlaneQuaternion :: RealFloat a => Orbit a -> Quaternion a
orbitalPlaneQuaternion :: Orbit a -> Quaternion a
orbitalPlaneQuaternion o :: Orbit a
o = Quaternion a
lon Quaternion a -> Quaternion a -> Quaternion a
forall a. Num a => a -> a -> a
* Quaternion a
per
where
per :: Quaternion a
per = case Orbit a -> PeriapsisSpecifier a
forall a. Orbit a -> PeriapsisSpecifier a
periapsisSpecifier Orbit a
o of
Eccentric ω :: Angle a
ω -> Angle a -> Quaternion a
forall a. Floating a => Angle a -> Quaternion a
rotateZ Angle a
ω
Circular -> 1
lon :: Quaternion a
lon = case Orbit a -> InclinationSpecifier a
forall a. Orbit a -> InclinationSpecifier a
inclinationSpecifier Orbit a
o of
Inclined _Ω :: Angle a
_Ω i :: Angle a
i -> Angle a -> Quaternion a
forall a. Floating a => Angle a -> Quaternion a
rotateZ Angle a
_Ω Quaternion a -> Quaternion a -> Quaternion a
forall a. Num a => a -> a -> a
* Angle a -> Quaternion a
forall a. Floating a => Angle a -> Quaternion a
rotateX Angle a
i
NonInclined -> 1
flightPathAngleAtTrueAnomaly
:: (Real a, Floating a) => Orbit a -> Angle a -> Angle a
flightPathAngleAtTrueAnomaly :: Orbit a -> Angle a -> Angle a
flightPathAngleAtTrueAnomaly o :: Orbit a
o ν :: Angle a
ν = Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
sign (Unitless a -> Angle a
forall a. Floating a => Unitless a -> Angle a
qArcCos Unitless a
Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
cosφ)
where
cosφ :: Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
cosφ = Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
Quantity ((Meter :^ Succ (Succ 'Zero)) :* (Second :^ Pred 'Zero)) a
h Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu '[ 'F Length ('S One), 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length ('S One), 'F Time ('P 'Zero)]
@- '[ 'F Length ('S One), 'F Time ('P 'Zero)]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Fractional n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @- b)) l n
|/| (Qu '[ 'F Length One] 'DefaultLCSU a
Distance a
r Qu '[ 'F Length One] 'DefaultLCSU a
-> Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
-> Qu
(Normalize
('[ 'F Length One] @+ '[ 'F Length One, 'F Time ('P 'Zero)]))
'DefaultLCSU
a
forall n (a :: [Factor *]) (l :: LCSU *) (b :: [Factor *]).
Num n =>
Qu a l n -> Qu b l n -> Qu (Normalize (a @+ b)) l n
|*| Qu '[ 'F Length One, 'F Time ('P 'Zero)] 'DefaultLCSU a
Speed a
v)
sign :: Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
sign = if (Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
Angle a
ν Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a (u :: [Factor *]) (l :: LCSU *).
Real a =>
Qu u l a -> Qu u l a -> Qu u l a
`mod'` Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a. Floating a => PlaneAngle a
turn) Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a -> Bool
forall a. Ord a => a -> a -> Bool
< Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a. Floating a => PlaneAngle a
halfTurn then Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall a. a -> a
id else Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
-> Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
forall n (d :: [Factor *]) (l :: LCSU *).
Num n =>
Qu d l n -> Qu d l n
qNegate
r :: Distance a
r = Orbit a -> Angle a -> Distance a
forall a. (Ord a, Floating a) => Orbit a -> Angle a -> Distance a
radiusAtTrueAnomaly Orbit a
o Angle a
ν
v :: Speed a
v = Orbit a -> Angle a -> Speed a
forall a. (Ord a, Floating a) => Orbit a -> Angle a -> Speed a
speedAtTrueAnomaly Orbit a
o Angle a
ν
h :: Quantity ((Meter :^ Succ (Succ 'Zero)) :* (Second :^ Pred 'Zero)) a
h = Orbit a
-> Quantity
((Meter :^ Succ (Succ 'Zero)) :* (Second :^ Pred 'Zero)) a
forall a.
Floating a =>
Orbit a
-> Quantity
((Meter :^ Succ (Succ 'Zero)) :* (Second :^ Pred 'Zero)) a
specificAngularMomentum Orbit a
o
qRotate
:: forall a q
. (Coercible (q a) a, Conjugate a, RealFloat a)
=> Quaternion a
-> V3 (q a)
-> V3 (q a)
qRotate :: Quaternion a -> V3 (q a) -> V3 (q a)
qRotate = (Quaternion a -> V3 a -> V3 a)
-> Quaternion a -> V3 (q a) -> V3 (q a)
forall a b. Coercible a b => a -> b
coerce ((Conjugate a, RealFloat a) => Quaternion a -> V3 a -> V3 a
forall a.
(Conjugate a, RealFloat a) =>
Quaternion a -> V3 a -> V3 a
rotate @a)
rotateX :: Floating a => Angle a -> Quaternion a
rotateX :: Angle a -> Quaternion a
rotateX θ :: Angle a
θ = a -> V3 a -> Quaternion a
forall a. a -> V3 a -> Quaternion a
Quaternion (a -> a
forall a. Floating a => a -> a
cos a
half) (a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 (a -> a
forall a. Floating a => a -> a
sin a
half) 0 0)
where half :: a
half = (Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
Angle a
θ Qu '[ 'F PlaneAngle One] 'DefaultLCSU a -> Radian -> a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
Qu dim 'DefaultLCSU n -> unit -> n
# [si|rad|]) a -> a -> a
forall a. Fractional a => a -> a -> a
/ 2
_rotateY :: Floating a => Angle a -> Quaternion a
_rotateY :: Angle a -> Quaternion a
_rotateY θ :: Angle a
θ = a -> V3 a -> Quaternion a
forall a. a -> V3 a -> Quaternion a
Quaternion (a -> a
forall a. Floating a => a -> a
cos a
half) (a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 0 (a -> a
forall a. Floating a => a -> a
sin a
half) 0)
where half :: a
half = (Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
Angle a
θ Qu '[ 'F PlaneAngle One] 'DefaultLCSU a -> Radian -> a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
Qu dim 'DefaultLCSU n -> unit -> n
# [si|rad|]) a -> a -> a
forall a. Fractional a => a -> a -> a
/ 2
rotateZ :: Floating a => Angle a -> Quaternion a
rotateZ :: Angle a -> Quaternion a
rotateZ θ :: Angle a
θ = a -> V3 a -> Quaternion a
forall a. a -> V3 a -> Quaternion a
Quaternion (a -> a
forall a. Floating a => a -> a
cos a
half) (a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 0 0 (a -> a
forall a. Floating a => a -> a
sin a
half))
where half :: a
half = (Qu '[ 'F PlaneAngle One] 'DefaultLCSU a
Angle a
θ Qu '[ 'F PlaneAngle One] 'DefaultLCSU a -> Radian -> a
forall (dim :: [Factor *]) unit n.
(ValidDLU dim 'DefaultLCSU unit, Fractional n) =>
Qu dim 'DefaultLCSU n -> unit -> n
# [si|rad|]) a -> a -> a
forall a. Fractional a => a -> a -> a
/ 2