X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FGrid.hs;h=ba8ca2007621c9e31536788d8204e0d0e6306463;hb=957754c693525096c5fd7427decd6404bbb03379;hp=7325d2b5b0968f5860834e21b809e9b67995dba8;hpb=c4701eee43e313f634d3d76faee681ff28d76b72;p=spline3.git diff --git a/src/Grid.hs b/src/Grid.hs index 7325d2b..ba8ca20 100644 --- a/src/Grid.hs +++ b/src/Grid.hs @@ -24,7 +24,8 @@ type CubeGrid = Array (Int,Int,Int) Cube -- function at the grid points, which are distance h from one -- another in each direction (x,y,z). data Grid = Grid { h :: Double, -- MUST BE GREATER THAN ZERO! - function_values :: Values3D } + function_values :: Values3D, + cube_grid :: CubeGrid } deriving (Eq, Show) @@ -40,31 +41,32 @@ instance Arbitrary Grid where make_grid :: Double -> Values3D -> Grid make_grid grid_size values | grid_size <= 0 = error "grid size must be positive" - | otherwise = Grid grid_size values + | otherwise = Grid grid_size values (cubes grid_size values) -- | Creates an empty grid with grid size 1. empty_grid :: Grid -empty_grid = Grid 1 empty3d +empty_grid = make_grid 1 empty3d -- | Returns a three-dimensional array of cubes centered on the grid --- points of g with the appropriate 'FunctionValues'. -cubes :: Grid -> CubeGrid -cubes g +-- points (h*i, h*j, h*k) with the appropriate 'FunctionValues'. +cubes :: Double -> Values3D -> CubeGrid +cubes delta fvs = array (lbounds, ubounds) [ ((i,j,k), cube_ijk) | i <- [0..xmax], j <- [0..ymax], k <- [0..zmax], - let cube_ijk = Cube (h g) i j k (make_values fvs i j k)] + let tet_vol = (1/24)*(delta^(3::Int)), + let cube_ijk = + Cube delta i j k (make_values fvs i j k) tet_vol] where xmax = xsize - 1 ymax = ysize - 1 zmax = zsize - 1 lbounds = (0, 0, 0) ubounds = (xmax, ymax, zmax) - fvs = function_values g (xsize, ysize, zsize) = dims fvs @@ -79,7 +81,7 @@ cube_at g i j k | j >= ysize = error "j >= ysize in cube_at" | k < 0 = error "k < 0 in cube_at" | k >= zsize = error "k >= zsize in cube_at" - | otherwise = (cubes g) ! (i,j,k) + | otherwise = (cube_grid g) ! (i,j,k) where fvs = function_values g (xsize, ysize, zsize) = dims fvs @@ -95,8 +97,8 @@ calculate_containing_cube_coordinate g coord -- Don't use a cube on the boundary if we can help it. This -- returns cube #1 if we would have returned cube #0 and cube #1 -- exists. - | coord == offset && (xsize > 0 && ysize > 0 && zsize > 0) = 1 | coord < offset = 0 + | coord == offset && (xsize > 1 && ysize > 1 && zsize > 1) = 1 | otherwise = (ceiling ( (coord + offset) / cube_width )) - 1 where (xsize, ysize, zsize) = dims (function_values g) @@ -127,9 +129,10 @@ zoom_result :: Grid -> ScaleFactor -> R.DIM3 -> Double zoom_result g (sfx, sfy, sfz) (R.Z R.:. i R.:. j R.:. k) = f p where - i' = (fromIntegral i) / (fromIntegral sfx) - j' = (fromIntegral j) / (fromIntegral sfy) - k' = (fromIntegral k) / (fromIntegral sfz) + offset = (h g)/2 + i' = (fromIntegral i) / (fromIntegral sfx) - offset + j' = (fromIntegral j) / (fromIntegral sfy) - offset + k' = (fromIntegral k) / (fromIntegral sfz) - offset p = (i', j', k') :: Point c = find_containing_cube g p t = find_containing_tetrahedron c p