module Util where

tripleDotProduct ::
     (Double, Double, Double) -> (Double, Double, Double) -> Double
tripleDotProduct :: (Double, Double, Double) -> (Double, Double, Double) -> Double
tripleDotProduct (Double
a, Double
b, Double
c) (Double
d, Double
e, Double
f) = Double
a Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
d Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
b Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
e Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
c Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
f

fromLinear :: Double -> Double
fromLinear :: Double -> Double
fromLinear Double
c =
  if Double
c Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
0.0031308
    then Double
12.92 Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
c
    else Double
1.055 Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
c Double -> Double -> Double
forall a. Floating a => a -> a -> a
** (Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
2.4)) Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
0.055

toLinear :: Double -> Double
toLinear :: Double -> Double
toLinear Double
c =
  if Double
c Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
>= Double
0.04045
    then ((Double
c Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
0.055) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ (Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
0.055)) Double -> Double -> Double
forall a. Floating a => a -> a -> a
** Double
2.4
    else Double
c Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
12.92