module Nonlinear.Projective.Hom2 where
import Nonlinear.Matrix
import Nonlinear.V2
import Nonlinear.V3
import Nonlinear.Vector ((*^))
vector :: Num a => V2 a -> V3 a
vector :: V2 a -> V3 a
vector (V2 a
a a
b) = a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 a
a a
b a
0
{-# INLINE vector #-}
point :: Num a => V2 a -> V3 a
point :: V2 a -> V3 a
point (V2 a
a a
b) = a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 a
a a
b a
1
{-# INLINE point #-}
normalizePoint :: Fractional a => V3 a -> V2 a
normalizePoint :: V3 a -> V2 a
normalizePoint (V3 a
a a
b a
w) = (a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
w) a -> V2 a -> V2 a
forall (f :: * -> *) a. (Vec f, Num a) => a -> f a -> f a
*^ a -> a -> V2 a
forall a. a -> a -> V2 a
V2 a
a a
b
{-# INLINE normalizePoint #-}
mkTransformation :: Num a => M22 a -> V2 a -> M33 a
mkTransformation :: M22 a -> V2 a -> M33 a
mkTransformation (V2 V2 a
r1 V2 a
r2) (V2 a
tx a
ty) =
V3 a -> V3 a -> V3 a -> M33 a
forall a. a -> a -> a -> V3 a
V3 (V2 a -> a -> V3 a
forall a. V2 a -> a -> V3 a
snoc2 V2 a
r1 a
tx) (V2 a -> a -> V3 a
forall a. V2 a -> a -> V3 a
snoc2 V2 a
r2 a
ty) (a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 a
0 a
0 a
1)
where
snoc2 :: V2 a -> a -> V3 a
snoc2 (V2 a
x a
y) = a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 a
x a
y
{-# INLINE mkTransformation #-}
translation :: Num a => V2 a -> M33 a
translation :: V2 a -> M33 a
translation = M22 a -> V2 a -> M33 a
forall a. Num a => M22 a -> V2 a -> M33 a
mkTransformation M22 a
forall (v :: * -> *) a. (Vec v, Num a) => v (v a)
identity
rotateRad :: Floating a => a -> M33 a
rotateRad :: a -> M33 a
rotateRad a
rad = M22 a -> V2 a -> M33 a
forall a. Num a => M22 a -> V2 a -> M33 a
mkTransformation M22 a
rot V2 a
0
where
cosR :: a
cosR = a -> a
forall a. Floating a => a -> a
cos a
rad
sinR :: a
sinR = a -> a
forall a. Floating a => a -> a
sin a
rad
rot :: M22 a
rot =
V2 a -> V2 a -> M22 a
forall a. a -> a -> V2 a
V2
(a -> a -> V2 a
forall a. a -> a -> V2 a
V2 a
cosR (a -> a
forall a. Num a => a -> a
negate a
sinR))
(a -> a -> V2 a
forall a. a -> a -> V2 a
V2 a
sinR a
cosR)
m22_to_m33 :: Num a => M22 a -> M33 a
m22_to_m33 :: M22 a -> M33 a
m22_to_m33 (V2 V2 a
r1 V2 a
r2) = V3 a -> V3 a -> V3 a -> M33 a
forall a. a -> a -> a -> V3 a
V3 (V2 a -> V3 a
forall a. Num a => V2 a -> V3 a
vector V2 a
r1) (V2 a -> V3 a
forall a. Num a => V2 a -> V3 a
vector V2 a
r2) (V2 a -> V3 a
forall a. Num a => V2 a -> V3 a
point V2 a
0)