4 import Prelude hiding (LT)
9 FunctionValues { front :: Double,
16 front_right :: 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,
38 empty_values :: FunctionValues
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
42 eval :: FunctionValues -> Cardinal -> Double
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
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)
76 value_at :: [[[Double]]] -> Int -> Int -> Int -> Double
81 | length values <= k = 0
82 | length (values !! k) <= j = 0
83 | length ((values !! k) !! j) <= i = 0
84 | otherwise = ((values !! k) !! j) !! i
86 make_values :: [[[Double]]] -> Int -> Int -> Int -> FunctionValues
87 make_values values i j k =
88 empty_values { front = value_at values (i-1) j k,
89 back = value_at values (i+1) j k,
90 left = value_at values i (j-1) k,
91 right = value_at values i (j+1) k,
92 down = value_at values i j (k-1),
93 top = value_at values i j (k+1),
94 front_left = value_at values (i-1) (j-1) k,
95 front_right = value_at values (i-1) (j+1) k,
96 front_down =value_at values (i-1) j (k-1),
97 front_top = value_at values (i-1) j (k+1),
98 back_left = value_at values (i+1) (j-1) k,
99 back_right = value_at values (i+1) (j+1) k,
100 back_down = value_at values (i+1) j (k-1),
101 back_top = value_at values (i+1) j (k+1),
102 left_down = value_at values i (j-1) (k-1),
103 left_top = value_at values i (j-1) (k+1),
104 right_top = value_at values i (j+1) (k+1),
105 right_down = value_at values i (j+1) (k-1),
106 front_left_down = value_at values (i-1) (j-1) (k-1),
107 front_left_top = value_at values (i-1) (j-1) (k+1),
108 front_right_down = value_at values (i-1) (j+1) (k-1),
109 front_right_top = value_at values (i-1) (j+1) (k+1),
110 back_left_down = value_at values (i-1) (j-1) (k-1),
111 back_left_top = value_at values (i+1) (j-1) (k+1),
112 back_right_down = value_at values (i+1) (j+1) (k-1),
113 back_right_top = value_at values (i+1) (j+1) (k+1),
114 interior = value_at values i j k }
116 rotate :: FunctionValues -> (Cardinal -> Cardinal) -> FunctionValues
118 FunctionValues { front = eval fv (rotation F),
119 back = eval fv (rotation B),
120 left = eval fv (rotation L),
121 right = eval fv (rotation R),
122 down = eval fv (rotation D),
123 top = eval fv (rotation T),
124 front_left = eval fv (rotation FL),
125 front_right = eval fv (rotation FR),
126 front_down = eval fv (rotation FD),
127 front_top = eval fv (rotation FT),
128 back_left = eval fv (rotation BL),
129 back_right = eval fv (rotation BR),
130 back_down = eval fv (rotation BD),
131 back_top = eval fv (rotation BT),
132 left_down = eval fv (rotation LD),
133 left_top = eval fv (rotation LT),
134 right_down = eval fv (rotation RD),
135 right_top = eval fv (rotation RT),
136 front_left_down = eval fv (rotation FLD),
137 front_left_top = eval fv (rotation FLT),
138 front_right_down = eval fv (rotation FRD),
139 front_right_top = eval fv (rotation FRT),
140 back_left_down = eval fv (rotation BLD),
141 back_left_top = eval fv (rotation BLT),
142 back_right_down = eval fv (rotation BRD),
143 back_right_top = eval fv (rotation BRT),
144 interior = interior fv }