empty_cube :: Cube
empty_cube = Cube empty_grid 0 0 0 0
--- TODO: The paper considers 'i' to be the front/back direction,
--- whereas I have it in the left/right direction.
+
instance Gridded Cube where
back c = cube_at (grid c) ((i c) + 1) (j c) (k c)
down c = cube_at (grid c) (i c) (j c) ((k c) - 1)
i' = fromIntegral (i c) :: Double
j' = fromIntegral (j c) :: Double
k' = fromIntegral (k c) :: Double
- x = (delta * i')
- y = (delta * j')
- z = (delta * k')
+ x = delta * i'
+ y = delta * j'
+ z = delta * k'
contains_point c p
| (x_coord p) < (xmin c) = False
fromRational q = empty_cube { datum = fromRational q }
+-- | Constructs a cube, switching the x and z axes.
reverse_cube :: Grid -> Int -> Int -> Int -> Double -> Cube
-reverse_cube g k' j' i' datum' = Cube g i' j' k' datum'
+reverse_cube g k' j' i' = Cube g i' j' k'
+-- | Return the cube corresponding to the grid point i,j,k. The list
+-- of cubes is stored as [z][y][x] but we'll be requesting it by
+-- [x][y][z] so we flip the indices in the last line.
cube_at :: Grid -> Int -> Int -> Int -> Cube
cube_at g i' j' k'
| i' >= length (function_values g) = 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 =
- Cube g i' j' k' ((((function_values g) !! i') !! j') !! k')
+ (((cubes g) !! k') !! j') !! i'
+
-- These next three functions basically form a 'for' loop, looping
-- through the xs, ys, and zs in that order.
-cubes_from_values :: Grid -> Int -> Int -> [Double] -> [Cube]
-cubes_from_values g i' j' vals =
- zipWith (reverse_cube g i' j') [0..] vals
-
-cubes_from_planes :: Grid -> Int -> [[Double]] -> [[Cube]]
-cubes_from_planes g i' planes =
- zipWith (cubes_from_values g i') [0..] planes
+-- | 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)