prune dead code
[maximus:mandulia.git] / src / Vector.hs
1 {-
2 Mandulia -- Mandelbrot/Julia explorer
3 Copyright (C) 2010  Claude Heiland-Allen <claudiusmaximus@goto10.org>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 -}
18
19 module Vector
20   ( R
21   , V(..)
22   , M(..)
23   , (^*)
24   , (^/)
25   , (^+^)
26   , (^-^)
27   , (^|-|^)
28   , (^^*^)
29   , (^^*^^)
30   , translate
31   , scale
32   , rotate
33   ) where
34
35 type R = Double
36 data V = V !R !R !R deriving (Show, Read, Eq, Ord)
37 data M = M !V !V !V deriving (Show, Read, Eq, Ord)
38
39 translate :: R -> R -> M
40 translate x y = M (V 1 0 x) (V 0 1 y) (V 0 0 1)
41
42 scale :: R -> R -> M
43 scale x y = M (V x 0 0) (V 0 y 0) (V 0 0 1)
44
45 rotate :: R -> M
46 rotate a = M (V c s 0) (V (-s) c 0) (V 0 0 1)
47   where
48     s = sin a
49     c = cos a
50
51 (^*) :: V -> R -> V
52 (V a b c)  ^*   x = V (a*x) (b*x) (c*x)
53
54 (^/) :: V -> R -> V
55 (V a b c)  ^/   x = V (a/x) (b/x) (c/x)
56
57 (^+^) :: V -> V -> V
58 (V a b c)  ^+^  (V x y z) = V (a+x) (b+y) (c+z)
59
60 (^-^) :: V -> V -> V
61 (V a b c)  ^-^  (V x y z) = V (a-x) (b-y) (c-z)
62
63 dot :: V -> V -> R
64 (V a b c) `dot` (V x y z) = a*x + b*y + c*z
65
66 (^^*^) :: M -> V -> V
67 (M (V a b c) (V d e f) (V g h i)) ^^*^ (V r u x) =
68   V (a * r + b * u + c * x)
69     (d * r + e * u + f * x)
70     (g * r + h * u + i * x)
71
72 (^^*^^) :: M -> M -> M
73 (M (V a b c) (V d e f) (V g h i)) ^^*^^ (M (V r s t) (V u v w) (V x y z)) =
74   M (V (a * r + b * u + c * x) (a * s + b * v + c * y) (a * t + b * w + c * z))
75     (V (d * r + e * u + f * x) (d * s + e * v + f * y) (d * t + e * w + f * z))
76     (V (g * r + h * u + i * x) (g * s + h * v + i * y) (g * t + h * w + i * z))
77
78 (^|-|^) :: V -> V -> R
79 u ^|-|^ v = let d = u ^-^ v in sqrt $ d `dot` d