-cube_at :: Grid -> Int -> Int -> Int -> Cube
-cube_at g i' j' k'
- | i' >= length (function_values g) = Cube g i' j' k' 0
- | i' < 0 = Cube g i' j' k' 0
- | j' >= length ((function_values g) !! i') = Cube g i' j' k' 0
- | j' < 0 = Cube g i' j' k' 0
- | k' >= length (((function_values g) !! i') !! j') = Cube g i' j' k' 0
- | k' < 0 = Cube g i' j' k' 0
- | otherwise =
- (((cubes g) !! k') !! j') !! i'
-
-
--- These next three functions basically form a 'for' loop, looping
--- through the xs, ys, and zs in that order.
-
--- | The cubes_from_values function will return a function that takes
--- a list of values and returns a list of cubes. It could just as
--- well be written to take the values as a parameter; the omission
--- of the last parameter is known as an eta reduce.
-cubes_from_values :: Grid -> Int -> Int -> ([Double] -> [Cube])
-cubes_from_values g i' j' =
- zipWith (reverse_cube g i' j') [0..]
-
--- | The cubes_from_planes function will return a function that takes
--- a list of planes and returns a list of cubes. It could just as
--- well be written to take the planes as a parameter; the omission
--- of the last parameter is known as an eta reduce.
-cubes_from_planes :: Grid -> Int -> ([[Double]] -> [[Cube]])
-cubes_from_planes g i' =
- zipWith (cubes_from_values g i') [0..]
-
--- | Takes a grid as an argument, and returns a three-dimensional list
--- of cubes centered on its grid points.
-cubes :: Grid -> [[[Cube]]]
-cubes g = zipWith (cubes_from_planes g) [0..] (function_values g)
+-- cube_at :: Grid -> Int -> Int -> Int -> Cube
+-- cube_at g i' j' k'
+-- | i' >= length (function_values g) = Cube g i' j' k' 0
+-- | i' < 0 = Cube g i' j' k' 0
+-- | j' >= length ((function_values g) !! i') = Cube g i' j' k' 0
+-- | j' < 0 = Cube g i' j' k' 0
+-- | k' >= length (((function_values g) !! i') !! j') = Cube g i' j' k' 0
+-- | k' < 0 = Cube g i' j' k' 0
+-- | otherwise =
+-- (((cubes g) !! k') !! j') !! i'
+
+
+
+
+
+
+-- Face stuff.
+
+-- | The top (in the direction of z) face of the cube.
+top_face :: Cube -> Face
+top_face c = Face v0' v1' v2' v3'
+ where
+ delta = (1/2)*(h c)
+ v0' = (center c) + (-delta, delta, delta)
+ v1' = (center c) + (delta, delta, delta)
+ v2' = (center c) + (delta, -delta, delta)
+ v3' = (center c) + (-delta, -delta, delta)
+
+
+
+-- | The back (in the direction of x) face of the cube.
+back_face :: Cube -> Face
+back_face c = Face v0' v1' v2' v3'
+ where
+ delta = (1/2)*(h c)
+ v0' = (center c) + (delta, delta, delta)
+ v1' = (center c) + (delta, delta, -delta)
+ v2' = (center c) + (delta, -delta, -delta)
+ v3' = (center c) + (delta, -delta, delta)
+
+
+-- The bottom face (in the direction of -z) of the cube.
+down_face :: Cube -> Face
+down_face c = Face v0' v1' v2' v3'
+ where
+ delta = (1/2)*(h c)
+ v0' = (center c) + (delta, delta, -delta)
+ v1' = (center c) + (-delta, delta, -delta)
+ v2' = (center c) + (-delta, -delta, -delta)
+ v3' = (center c) + (delta, -delta, -delta)
+
+
+
+-- | The front (in the direction of -x) face of the cube.
+front_face :: Cube -> Face
+front_face c = Face v0' v1' v2' v3'
+ where
+ delta = (1/2)*(h c)
+ v0' = (center c) + (-delta, delta, -delta)
+ v1' = (center c) + (-delta, delta, delta)
+ v2' = (center c) + (-delta, -delta, delta)
+ v3' = (center c) + (-delta, -delta, -delta)
+
+
+-- | The left (in the direction of -y) face of the cube.
+left_face :: Cube -> Face
+left_face c = Face v0' v1' v2' v3'
+ where
+ delta = (1/2)*(h c)
+ v0' = (center c) + (-delta, -delta, delta)
+ v1' = (center c) + (delta, -delta, delta)
+ v2' = (center c) + (delta, -delta, -delta)
+ v3' = (center c) + (-delta, -delta, -delta)
+
+
+-- | The right (in the direction of y) face of the cube.
+right_face :: Cube -> Face
+right_face c = Face v0' v1' v2' v3'
+ where
+ delta = (1/2)*(h c)
+ v0' = (center c) + (-delta, delta, -delta)
+ v1' = (center c) + (delta, delta, -delta)
+ v2' = (center c) + (delta, delta, delta)
+ v3' = (center c) + (-delta, delta, delta)
+