1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
{-|
Module : Vec
Description : Small Vector module
Copyright : (c) 2019, Yann Herklotz Grave
License : GPL-3
Maintainer : ymherklotz [at] gmail [dot] com
Stability : experimental
Portability : POSIX
Small Vector module
-}
module Vec where
newtype Vec a = Vec { unVec :: (a, a, a) }
deriving (Show)
instance Functor Vec where
fmap f (Vec (a, b, c)) = Vec (f a, f b, f c)
findZ :: (Floating a) => a -> a -> Vec a
findZ x y =
Vec (x, y, sqrt (1 - x^^2 - y^^2))
dot :: (Num a) => Vec a -> Vec a -> a
dot (Vec (x1, y1, z1)) (Vec (x2, y2, z2)) =
x1 * x2 + y1 * y2 + z1 * z2
normalise :: (Floating a) => Int -> (Int, Int) -> Vec a
normalise size (y, x) =
findZ (scale x) $ scale y
where
scale a = 2 * fromIntegral a / fromIntegral size - 1
reflect :: (Floating a) => Int -> Vec a -> (Int, Int) -> Vec a
reflect size v (y, x) =
n
where
n = normalise size (y, x)
|