{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Numeric.Matrix.Internal.Double () where
import qualified Control.Monad.ST as ST
import qualified Numeric.DataFrame.ST as ST
import Numeric.Dimensions (KnownDim)
import Numeric.Matrix.Internal
import Numeric.Matrix.LU
import Numeric.Scalar.Internal
import Numeric.Vector.Internal
{-# INLINE mkMat #-}
mkMat ::
Double -> Double -> Double -> Double ->
Double -> Double -> Double -> Double ->
Double -> Double -> Double -> Double ->
Double -> Double -> Double -> Double ->
Mat44d
mkMat :: Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
Double
_11 Double
_12 Double
_13 Double
_14
Double
_21 Double
_22 Double
_23 Double
_24
Double
_31 Double
_32 Double
_33 Double
_34
Double
_41 Double
_42 Double
_43 Double
_44
= (forall s. ST s Mat44d) -> Mat44d
forall a. (forall s. ST s a) -> a
ST.runST ((forall s. ST s Mat44d) -> Mat44d)
-> (forall s. ST s Mat44d) -> Mat44d
forall a b. (a -> b) -> a -> b
$ do
STDataFrame s Double '[4, 4]
df <- ST s (STDataFrame s Double '[4, 4])
forall k t (ns :: [k]) s.
(PrimBytes t, Dimensions ns) =>
ST s (STDataFrame s t ns)
ST.newDataFrame
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
0 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_11
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
1 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_12
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
2 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_13
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
3 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_14
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
4 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_21
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
5 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_22
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
6 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_23
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
7 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_24
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
8 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_31
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
9 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_32
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
10 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_33
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
11 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_34
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
12 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_41
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
13 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_42
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
14 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_43
STDataFrame s Double '[4, 4]
-> Int -> DataFrame Double '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Double '[4, 4]
df Int
15 (DataFrame Double '[] -> ST s ())
-> DataFrame Double '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Double -> DataFrame Double '[]
forall t. t -> DataFrame t '[]
scalar Double
_44
STDataFrame s Double '[4, 4] -> ST s Mat44d
forall k t (ns :: [k]) s.
PrimArray t (DataFrame t ns) =>
STDataFrame s t ns -> ST s (DataFrame t ns)
ST.unsafeFreezeDataFrame STDataFrame s Double '[4, 4]
df
instance HomTransform4 Double where
{-# INLINE translate4 #-}
translate4 :: Vector Double 4 -> Mat44d
translate4 (Vector Double 4 -> (# Double, Double, Double, Double #)
forall t. Vector4 t => Vector t 4 -> (# t, t, t, t #)
unpackV4# -> (# Double
x, Double
y, Double
z, Double
_ #)) = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
Double
1 Double
0 Double
0 Double
0
Double
0 Double
1 Double
0 Double
0
Double
0 Double
0 Double
1 Double
0
Double
x Double
y Double
z Double
1
{-# INLINE translate3 #-}
translate3 :: Vector Double 3 -> Mat44d
translate3 (Vector Double 3 -> (# Double, Double, Double #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# -> (# Double
x, Double
y, Double
z #)) = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
Double
1 Double
0 Double
0 Double
0
Double
0 Double
1 Double
0 Double
0
Double
0 Double
0 Double
1 Double
0
Double
x Double
y Double
z Double
1
{-# INLINE rotateX #-}
rotateX :: Double -> Mat44d
rotateX Double
a = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
Double
1 Double
0 Double
0 Double
0
Double
0 Double
c Double
s Double
0
Double
0 Double
n Double
c Double
0
Double
0 Double
0 Double
0 Double
1
where
c :: Double
c = Double -> Double
forall a. Floating a => a -> a
cos Double
a
s :: Double
s = Double -> Double
forall a. Floating a => a -> a
sin Double
a
n :: Double
n = -Double
s
{-# INLINE rotateY #-}
rotateY :: Double -> Mat44d
rotateY Double
a = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
Double
c Double
0 Double
n Double
0
Double
0 Double
1 Double
0 Double
0
Double
s Double
0 Double
c Double
0
Double
0 Double
0 Double
0 Double
1
where
c :: Double
c = Double -> Double
forall a. Floating a => a -> a
cos Double
a
s :: Double
s = Double -> Double
forall a. Floating a => a -> a
sin Double
a
n :: Double
n = -Double
s
{-# INLINE rotateZ #-}
rotateZ :: Double -> Mat44d
rotateZ Double
a = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
Double
c Double
s Double
0 Double
0
Double
n Double
c Double
0 Double
0
Double
0 Double
0 Double
1 Double
0
Double
0 Double
0 Double
0 Double
1
where
c :: Double
c = Double -> Double
forall a. Floating a => a -> a
cos Double
a
s :: Double
s = Double -> Double
forall a. Floating a => a -> a
sin Double
a
n :: Double
n = -Double
s
{-# INLINE rotate #-}
rotate :: Vector Double 3 -> Double -> Mat44d
rotate (Vector Double 3 -> (# Double, Double, Double #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# -> (# Double
x, Double
y, Double
z #)) Double
a = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
(Double
cDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
xxv) (Double
yxvDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
zs) (Double
zxvDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
ys) Double
0
(Double
xyvDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
zs) (Double
cDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
yyv) (Double
zyvDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
xs) Double
0
(Double
xzvDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
ys) (Double
yzvDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
xs) (Double
cDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
zzv) Double
0
Double
0 Double
0 Double
0 Double
1
where
c :: Double
c = Double -> Double
forall a. Floating a => a -> a
cos Double
a
v :: Double
v = Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
c
s :: Double
s = Double -> Double
forall a. Floating a => a -> a
sin Double
a
xxv :: Double
xxv = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
xyv :: Double
xyv = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
xzv :: Double
xzv = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
yxv :: Double
yxv = Double
xyv
yyv :: Double
yyv = Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
yzv :: Double
yzv = Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
zxv :: Double
zxv = Double
xzv
zyv :: Double
zyv = Double
yzv
zzv :: Double
zzv = Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
xs :: Double
xs = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
s
ys :: Double
ys = Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
s
zs :: Double
zs = Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
s
{-# INLINE rotateEuler #-}
rotateEuler :: Double -> Double -> Double -> Mat44d
rotateEuler Double
x Double
y Double
z = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
(Double
cyDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cz) (Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
szDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
syDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cz) (Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
szDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
syDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cz) Double
0
(-Double
cyDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
sz) (Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
czDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
syDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
sz) (Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
czDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
syDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
sz) Double
0
Double
sy (-Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cy) (Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cy) Double
0
Double
0 Double
0 Double
0 Double
1
where
cx :: Double
cx = Double -> Double
forall a. Floating a => a -> a
cos Double
x
sx :: Double
sx = Double -> Double
forall a. Floating a => a -> a
sin Double
x
cy :: Double
cy = Double -> Double
forall a. Floating a => a -> a
cos Double
y
sy :: Double
sy = Double -> Double
forall a. Floating a => a -> a
sin Double
y
cz :: Double
cz = Double -> Double
forall a. Floating a => a -> a
cos Double
z
sz :: Double
sz = Double -> Double
forall a. Floating a => a -> a
sin Double
z
{-# INLINE lookAt #-}
lookAt :: Vector Double 3 -> Vector Double 3 -> Vector Double 3 -> Mat44d
lookAt Vector Double 3
up Vector Double 3
cam Vector Double 3
foc = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
Double
xb1 Double
yb1 Double
zb1 Double
0
Double
xb2 Double
yb2 Double
zb2 Double
0
Double
xb3 Double
yb3 Double
zb3 Double
0
Double
tx Double
ty Double
tz Double
1
where
(# Double
xb1, Double
xb2, Double
xb3 #) = Vector Double 3 -> (# Double, Double, Double #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# Vector Double 3
xb
(# Double
yb1, Double
yb2, Double
yb3 #) = Vector Double 3 -> (# Double, Double, Double #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# Vector Double 3
yb
(# Double
zb1, Double
zb2, Double
zb3 #) = Vector Double 3 -> (# Double, Double, Double #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# Vector Double 3
zb
zb :: Vector Double 3
zb = Vector Double 3 -> Vector Double 3
forall k t (n :: k).
(Floating (DataFrame t '[]), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n
normalized (Vector Double 3 -> Vector Double 3)
-> Vector Double 3 -> Vector Double 3
forall a b. (a -> b) -> a -> b
$ Vector Double 3
cam Vector Double 3 -> Vector Double 3 -> Vector Double 3
forall a. Num a => a -> a -> a
- Vector Double 3
foc
xb :: Vector Double 3
xb = Vector Double 3 -> Vector Double 3
forall k t (n :: k).
(Floating (DataFrame t '[]), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n
normalized (Vector Double 3 -> Vector Double 3)
-> Vector Double 3 -> Vector Double 3
forall a b. (a -> b) -> a -> b
$ Vector Double 3
up Vector Double 3 -> Vector Double 3 -> Vector Double 3
forall t.
(Num t, PrimBytes t) =>
Vector t 3 -> Vector t 3 -> Vector t 3
`cross` Vector Double 3
zb
yb :: Vector Double 3
yb = Vector Double 3
zb Vector Double 3 -> Vector Double 3 -> Vector Double 3
forall t.
(Num t, PrimBytes t) =>
Vector t 3 -> Vector t 3 -> Vector t 3
`cross` Vector Double 3
xb
ncam :: Vector Double 3
ncam = -Vector Double 3
cam
tx :: Double
tx = DataFrame Double '[] -> Double
forall t. DataFrame t '[] -> t
unScalar (DataFrame Double '[] -> Double) -> DataFrame Double '[] -> Double
forall a b. (a -> b) -> a -> b
$ Vector Double 3
xb Vector Double 3 -> Vector Double 3 -> DataFrame Double '[]
forall t (n :: Nat).
(Num t, Num (Vector t n), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n -> Scalar t
`dot` Vector Double 3
ncam
ty :: Double
ty = DataFrame Double '[] -> Double
forall t. DataFrame t '[] -> t
unScalar (DataFrame Double '[] -> Double) -> DataFrame Double '[] -> Double
forall a b. (a -> b) -> a -> b
$ Vector Double 3
yb Vector Double 3 -> Vector Double 3 -> DataFrame Double '[]
forall t (n :: Nat).
(Num t, Num (Vector t n), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n -> Scalar t
`dot` Vector Double 3
ncam
tz :: Double
tz = DataFrame Double '[] -> Double
forall t. DataFrame t '[] -> t
unScalar (DataFrame Double '[] -> Double) -> DataFrame Double '[] -> Double
forall a b. (a -> b) -> a -> b
$ Vector Double 3
zb Vector Double 3 -> Vector Double 3 -> DataFrame Double '[]
forall t (n :: Nat).
(Num t, Num (Vector t n), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n -> Scalar t
`dot` Vector Double 3
ncam
{-# INLINE perspective #-}
perspective :: Double -> Double -> Double -> Double -> Mat44d
perspective Double
n Double
f Double
fovy Double
aspect = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
Double
dpw Double
0 Double
0 Double
0
Double
0 Double
dph Double
0 Double
0
Double
0 Double
0 Double
a (-Double
1)
Double
0 Double
0 Double
b Double
0
where
hpd :: Double
hpd = Double -> Double
forall a. Floating a => a -> a
tan (Double
fovy Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
0.5)
wpd :: Double
wpd = Double
aspect Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
hpd;
dph :: Double
dph = Double -> Double
forall a. Fractional a => a -> a
recip Double
hpd
dpw :: Double
dpw = Double -> Double
forall a. Fractional a => a -> a
recip Double
wpd
nmf :: Double
nmf = Double
n Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
f
a :: Double
a = (Double
n Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
f) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
nmf
b :: Double
b = Double
2 Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
n Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
f Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
nmf
{-# INLINE orthogonal #-}
orthogonal :: Double -> Double -> Double -> Double -> Mat44d
orthogonal Double
n Double
f Double
w Double
h = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
Double
iw Double
0 Double
0 Double
0
Double
0 Double
ih Double
0 Double
0
Double
0 Double
0 Double
a Double
0
Double
0 Double
0 Double
b Double
1
where
ih :: Double
ih = Double
2 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
h
iw :: Double
iw = Double
2 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
w
nmf :: Double
nmf = Double
n Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
f
a :: Double
a = Double
2 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
nmf
b :: Double
b = (Double
n Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
f) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
nmf
{-# INLINE toHomPoint #-}
toHomPoint :: Vector Double 3 -> Vector Double 4
toHomPoint (Vector Double 3 -> (# Double, Double, Double #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# -> (# Double
x, Double
y, Double
z #)) = Double -> Double -> Double -> Double -> Vector Double 4
forall t. Vector4 t => t -> t -> t -> t -> Vector t 4
vec4 Double
x Double
y Double
z Double
1
{-# INLINE toHomVector #-}
toHomVector :: Vector Double 3 -> Vector Double 4
toHomVector (Vector Double 3 -> (# Double, Double, Double #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# -> (# Double
x, Double
y, Double
z #)) = Double -> Double -> Double -> Double -> Vector Double 4
forall t. Vector4 t => t -> t -> t -> t -> Vector t 4
vec4 Double
x Double
y Double
z Double
0
{-# INLINE fromHom #-}
fromHom :: Vector Double 4 -> Vector Double 3
fromHom (Vector Double 4 -> (# Double, Double, Double, Double #)
forall t. Vector4 t => Vector t 4 -> (# t, t, t, t #)
unpackV4# -> (# Double
x, Double
y, Double
z, Double
w #))
| Double
w Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
== Double
0 = Double -> Double -> Double -> Vector Double 3
forall t. Vector3 t => t -> t -> t -> Vector t 3
vec3 Double
x Double
y Double
z
| Bool
otherwise = Double -> Double -> Double -> Vector Double 3
forall t. Vector3 t => t -> t -> t -> Vector t 3
vec3 (Double
xDouble -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
w) (Double
yDouble -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
w) (Double
zDouble -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
w)
instance KnownDim n => MatrixInverse Double n where
inverse :: Matrix Double n n -> Matrix Double n n
inverse = Matrix Double n n -> Matrix Double n n
forall t (n :: Nat). MatrixLU t n => Matrix t n n -> Matrix t n n
inverseViaLU
instance KnownDim n => MatrixDeterminant Double n where
det :: Matrix Double n n -> DataFrame Double '[]
det = Matrix Double n n -> DataFrame Double '[]
forall t (n :: Nat). MatrixLU t n => Matrix t n n -> Scalar t
detViaLU