use super::*;
use strategy::*;
impl<D> Strategy2D<D> for Linear
where
D: Data + RawDataClone + Clone,
D::Elem: Num + PartialOrd + Copy + Debug,
{
fn interpolate(
&self,
data: &InterpData2D<D>,
point: &[D::Elem; 2],
) -> Result<D::Elem, InterpolateError> {
let lowers: [usize; 2] = std::array::from_fn(|dim| {
if &point[dim] < data.grid[dim].first().unwrap() {
0
} else if &point[dim] > data.grid[dim].last().unwrap() {
data.grid[dim].len() - 2
} else {
find_nearest_index(data.grid[dim].view(), &point[dim])
}
});
let x_l = lowers[0];
let x_u = x_l + 1;
let x_diff = (point[0] - data.grid[0][x_l]) / (data.grid[0][x_u] - data.grid[0][x_l]);
let y_l = lowers[1];
let y_u = y_l + 1;
let y_diff = (point[1] - data.grid[1][y_l]) / (data.grid[1][y_u] - data.grid[1][y_l]);
let f0 =
data.values[[x_l, y_l]] * (D::Elem::one() - x_diff) + data.values[[x_u, y_l]] * x_diff;
let f1 =
data.values[[x_l, y_u]] * (D::Elem::one() - x_diff) + data.values[[x_u, y_u]] * x_diff;
Ok(f0 * (D::Elem::one() - y_diff) + f1 * y_diff)
}
fn allow_extrapolate(&self) -> bool {
true
}
}
impl<D> Strategy2D<D> for Nearest
where
D: Data + RawDataClone + Clone,
D::Elem: Num + PartialOrd + Copy + Debug,
{
fn interpolate(
&self,
data: &InterpData2D<D>,
point: &[D::Elem; 2],
) -> Result<D::Elem, InterpolateError> {
let x_l = find_nearest_index(data.grid[0].view(), &point[0]);
let x_u = x_l + 1;
let i = if point[0] - data.grid[0][x_l] < data.grid[0][x_u] - point[0] {
x_l
} else {
x_u
};
let y_l = find_nearest_index(data.grid[1].view(), &point[1]);
let y_u = y_l + 1;
let j = if point[1] - data.grid[1][y_l] < data.grid[1][y_u] - point[1] {
y_l
} else {
y_u
};
Ok(data.values[[i, j]])
}
fn allow_extrapolate(&self) -> bool {
false
}
}