Tabulated2DFunction::get(): out-of-bounds fix, also preferring interpolation to extrapolation
There are two issues. First, we have m * n points, so (m-1) * (n - 1) intervals. The existing iToX
and jToY
functions are written in accordance. However, xToI
and jToY
do not match. They assume that there are m*n intervals. That needs to be fixed.
The second issue is the following code in get():
int i = max(0, min(m_, static_cast<int>(alpha)));
int j = max(0, min(n_, static_cast<int>(beta)));
With x == xMax
, alpha will be as big as (m_- 1
) even after the proposed fix to xToI
. But we need an interval number here, not a point number, and there is no (m_- 1
)-th interval (not to mention _m
-th). So we need to cut i
at (m_ - 2
). Similarly with j
.
Without the fix, the assertions in getSamplePoint
assert(0 <= i && i < m_);
assert(0 <= j && j < n_);
rightfully fail when x
is close to xMax
or y
is close to yMax
.