--- supplied list. If there is no such value, zero is returned.
-value_at :: [[[Double]]] -> Int -> Int -> Int -> Double
-value_at values i j k
- | i < 0 = 0
- | j < 0 = 0
- | k < 0 = 0
- | length values <= k = 0
- | length (values !! k) <= j = 0
- | length ((values !! k) !! j) <= i = 0
- | otherwise = ((values !! k) !! j) !! i
+-- supplied list. If there is no such value, we choose a nearby
+-- point and use its value.
+value_at :: Values3D -> Int -> Int -> Int -> Double
+value_at v3d i j k
+ | i < 0 = value_at v3d 0 j k
+ | j < 0 = value_at v3d i 0 k
+ | k < 0 = value_at v3d i j 0
+ | xsize <= i = value_at v3d xsize j k
+ | ysize <= j = value_at v3d i ysize k
+ | zsize <= k = value_at v3d i j zsize
+ | otherwise = idx v3d i j k
+ where
+ (xsize, ysize, zsize) = dims v3d