]> gitweb.michael.orlitzky.com - spline3.git/blob - src/FunctionValues.hs
Add the code to rotate a FunctionValues object.
[spline3.git] / src / FunctionValues.hs
1 module FunctionValues
2 where
3
4 import Prelude hiding (LT)
5
6 import Cardinal
7
8 data FunctionValues =
9 FunctionValues { front :: Double,
10 back :: Double,
11 left :: Double,
12 right :: Double,
13 top :: Double,
14 down :: Double,
15 front_left :: Double,
16 front_right :: Double,
17 front_top :: Double,
18 front_down :: Double,
19 back_left :: Double,
20 back_right :: Double,
21 back_top :: Double,
22 back_down :: Double,
23 left_top :: Double,
24 left_down :: Double,
25 right_top :: Double,
26 right_down :: Double,
27 front_left_top :: Double,
28 front_left_down :: Double,
29 front_right_top :: Double,
30 front_right_down :: Double,
31 back_left_top :: Double,
32 back_left_down :: Double,
33 back_right_top :: Double,
34 back_right_down :: Double,
35 interior :: Double }
36 deriving (Eq, Show)
37
38 empty_values :: FunctionValues
39 empty_values =
40 FunctionValues 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
41
42 eval :: FunctionValues -> Cardinal -> Double
43 eval f F = front f
44 eval f B = back f
45 eval f L = left f
46 eval f R = right f
47 eval f T = top f
48 eval f D = down f
49 eval f FL = front_left f
50 eval f FR = front_right f
51 eval f FD = front_down f
52 eval f FT = front_top f
53 eval f BL = back_left f
54 eval f BR = back_right f
55 eval f BD = back_down f
56 eval f BT = back_top f
57 eval f LD = left_down f
58 eval f LT = left_top f
59 eval f RD = right_down f
60 eval f RT = right_top f
61 eval f FLD = front_left_down f
62 eval f FLT = front_left_top f
63 eval f FRD = front_right_down f
64 eval f FRT = front_right_top f
65 eval f BLD = back_left_down f
66 eval f BLT = back_left_top f
67 eval f BRD = back_right_down f
68 eval f BRT = back_right_top f
69 eval f I = interior f
70 eval _ (Scalar x) = x
71 eval f (Sum x y) = (eval f x) + (eval f y)
72 eval f (Difference x y) = (eval f x) - (eval f y)
73 eval f (Product x y) = (eval f x) * (eval f y)
74 eval f (Quotient x y) = (eval f x) / (eval f y)
75
76 value_at :: [[[Double]]] -> Int -> Int -> Int -> Double
77 value_at values i j k =
78 ((values !! k) !! j) !! i
79
80 make_values :: [[[Double]]] -> Int -> Int -> Int -> FunctionValues
81 make_values values i j k =
82 empty_values { front = value_at values (i-1) j k,
83 back = value_at values (i+1) j k,
84 left = value_at values i (j-1) k,
85 right = value_at values i (j+1) k,
86 down = value_at values i j (k-1),
87 top = value_at values i j (k+1),
88 front_left = value_at values (i-1) (j-1) k,
89 front_right = value_at values (i-1) (j+1) k,
90 front_down =value_at values (i-1) j (k-1),
91 front_top = value_at values (i-1) j (k+1),
92 back_left = value_at values (i+1) (j-1) k,
93 back_right = value_at values (i+1) (j+1) k,
94 back_down = value_at values (i+1) j (k-1),
95 back_top = value_at values (i+1) j (k+1),
96 left_down = value_at values i (j-1) (k-1),
97 left_top = value_at values i (j-1) (k+1),
98 right_top = value_at values i (j+1) (k+1),
99 right_down = value_at values i (j+1) (k-1),
100 front_left_down = value_at values (i-1) (j-1) (k-1),
101 front_left_top = value_at values (i-1) (j-1) (k+1),
102 front_right_down = value_at values (i-1) (j+1) (k-1),
103 front_right_top = value_at values (i-1) (j+1) (k+1),
104 back_left_down = value_at values (i-1) (j-1) (k-1),
105 back_left_top = value_at values (i+1) (j-1) (k+1),
106 back_right_down = value_at values (i+1) (j+1) (k-1),
107 back_right_top = value_at values (i+1) (j+1) (k+1),
108 interior = value_at values i j k }
109
110 rotate :: FunctionValues -> (Cardinal -> Cardinal) -> FunctionValues
111 rotate fv rotation =
112 FunctionValues { front = eval fv (rotation F),
113 back = eval fv (rotation B),
114 left = eval fv (rotation L),
115 right = eval fv (rotation R),
116 down = eval fv (rotation D),
117 top = eval fv (rotation T),
118 front_left = eval fv (rotation FL),
119 front_right = eval fv (rotation FR),
120 front_down = eval fv (rotation FD),
121 front_top = eval fv (rotation FT),
122 back_left = eval fv (rotation BL),
123 back_right = eval fv (rotation BR),
124 back_down = eval fv (rotation BD),
125 back_top = eval fv (rotation BT),
126 left_down = eval fv (rotation LD),
127 left_top = eval fv (rotation LT),
128 right_down = eval fv (rotation RD),
129 right_top = eval fv (rotation RT),
130 front_left_down = eval fv (rotation FLD),
131 front_left_top = eval fv (rotation FLT),
132 front_right_down = eval fv (rotation FRD),
133 front_right_top = eval fv (rotation FRT),
134 back_left_down = eval fv (rotation BLD),
135 back_left_top = eval fv (rotation BLT),
136 back_right_down = eval fv (rotation BRD),
137 back_right_top = eval fv (rotation BRT),
138 interior = interior fv }