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)
fromRational q = empty_cube { datum = fromRational q }
--- | Constructs a cube, switching the i and k axes.
+-- | Constructs a cube, switching the x and z axes.
reverse_cube :: Grid -> Int -> Int -> Int -> Double -> Cube
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.