- -- The next three are from the first line in (7.3).
- | (i == -1) && (j >= 0) && (k >= 0) =
- 2*(value_at v3d 0 j k) - (value_at v3d 1 j k)
-
- | (i >= 0) && (j == -1) && (k >= 0) =
- 2*(value_at v3d i 0 k) - (value_at v3d i 1 k)
-
- | (i >= 0) && (j >= 0) && (k == -1) =
- 2*(value_at v3d i j 0) - (value_at v3d i j 1)
-
- -- The next two are from the second line in (7.3).
- | (i == -1) && (j == -1) && (k >= 0) =
- 2*(value_at v3d i 0 k) - (value_at v3d i 1 k)
-
- | (i == -1) && (j == ysize) && (k >= 0) =
- 2*(value_at v3d i (ysize - 1) k) - (value_at v3d i (ysize - 2) k)
-
- -- The next two are from the third line in (7.3).
- | (i == -1) && (j >= 0) && (k == -1) =
- 2*(value_at v3d i j 0) - (value_at v3d i j 1)
-
- | (i == -1) && (j >= 0) && (k == zsize) =
- 2*(value_at v3d i j (zsize - 1)) - (value_at v3d i j (zsize - 2))
-
- -- Repeat the above (j and k) cases for i >= 0.
- | (i >= 0) && (j == -1) && (k == -1) =
- 2*(value_at v3d i j 0) - (value_at v3d i j 1)
-
- | (i == xsize) && (j == -1) && (k >= 0) =
- 2*(value_at v3d (xsize - 1) j k) - (value_at v3d (xsize - 2) j k)
-
- -- These two cases I made up.
- | (i == -1) && (j == -1) && (k == -1) =
- 2*(value_at v3d i j 0) - (value_at v3d i j 1)
-
- | (i == xsize) && (j == ysize) && (k == zsize) =
- 2*(value_at v3d i j (zsize - 1)) - (value_at v3d i j (zsize - 2))
+ -- The next three are from the first line in (7.3). Analogous cases
+ -- have been added where the indices are one-too-big. These are the
+ -- "one index is bad" cases.
+ | not (valid_i i) =
+ if (dim_i == 1)
+ then
+ -- We're one-dimensional in our first coordinate, so just
+ -- return the data point that we do have. If we try to use
+ -- the formula from remark 7.3, we go into an infinite loop.
+ value_at v3d 0 j k
+ else
+ if (i == -1)
+ then
+ 2*(value_at v3d 0 j k) - (value_at v3d 1 j k)
+ else
+ 2*(value_at v3d (i-1) j k) - (value_at v3d (i-2) j k)
+
+ | not (valid_j j) =
+ if (dim_j == 1)
+ then
+ -- We're one-dimensional in our second coordinate, so just
+ -- return the data point that we do have. If we try to use
+ -- the formula from remark 7.3, we go into an infinite loop.
+ value_at v3d i 0 k
+ else
+ if (j == -1)
+ then
+ 2*(value_at v3d i 0 k) - (value_at v3d i 1 k)
+ else
+ 2*(value_at v3d i (j-1) k) - (value_at v3d i (j-2) k)
+
+ | not (valid_k k) =
+ if (dim_k == 1)
+ then
+ -- We're one-dimensional in our third coordinate, so just
+ -- return the data point that we do have. If we try to use
+ -- the formula from remark 7.3, we go into an infinite loop.
+ value_at v3d i j 0
+ else
+ if (k == -1)
+ then
+ 2*(value_at v3d i j 0) - (value_at v3d i j 1)
+ else
+ 2*(value_at v3d i j (k-1)) - (value_at v3d i j (k-2))