X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FGrid.hs;h=4b75185ad19b31b4922e5485105b069ec56dba96;hb=58cf11569acb270995d2de924dda03ef526647e2;hp=e67ac764022a82ab974593395482ec4d6cfa81fc;hpb=89b8b6e94fcc944a1f4611811265f3c6217af850;p=spline3.git diff --git a/src/Grid.hs b/src/Grid.hs index e67ac76..4b75185 100644 --- a/src/Grid.hs +++ b/src/Grid.hs @@ -1,13 +1,12 @@ -- | The Grid module just contains the Grid type and two constructors -- for it. We hide the main Grid constructor because we don't want -- to allow instantiation of a grid with h <= 0. -module Grid (empty_grid, - function_values, - Grid, - h, - make_grid) +module Grid where +import Cube (Cube(Cube)) +import FunctionValues + -- | Our problem is defined on a Grid. The grid size is given by the -- positive number h. The function values are the values of the -- function at the grid points, which are distance h from one @@ -28,3 +27,34 @@ make_grid grid_size values -- | Creates an empty grid with grid size 1. empty_grid :: Grid empty_grid = Grid 1 [[[]]] + + +-- | Returns a three-dimensional list of cubes centered on the grid +-- points of g with the appropriate 'FunctionValues'. +cubes :: Grid -> [[[Cube]]] +cubes g + | fvs == [[[]]] = [[[]]] + | head fvs == [[]] = [[[]]] + | otherwise = + [[[ Cube (h g) i j k (make_values fvs i j k) | i <- [0..xsize]] + | j <- [0..ysize]] + | k <- [0..zsize]] + where + fvs = function_values g + zsize = (length fvs) - 1 + ysize = (length $ head fvs) - 1 + xsize = (length $ head $ head fvs) - 1 + + +-- | Takes a grid and a position as an argument and returns the cube +-- centered on that position. If there is no cube there (i.e. the +-- position is outside of the grid), it will return 'Nothing'. +cube_at :: Grid -> Int -> Int -> Int -> Maybe Cube +cube_at g i j k + | i < 0 = Nothing + | j < 0 = Nothing + | k < 0 = Nothing + | i >= length (cubes g) = Nothing + | j >= length ((cubes g) !! i) = Nothing + | k >= length (((cubes g) !! i) !! j) = Nothing + | otherwise = Just $ (((cubes g) !! i) !! j) !! k