bilinearInterpolator = func => (x, y) => {
const x1 = Math.floor(x);
const x2 = Math.ceil(x);
const y1 = Math.floor(y);
const y2 = Math.ceil(y);
if ((x1 === x2) && (y1 === y2)) return func(x1, y1);
if (x1 === x2) {
return (func(x1, y1) * (y2 - y) + func(x1, y2) * (y - y1)) / (y2 - y1);
}
if (y1 === y2) {
return (func(x1, y1) * (x2 - x) + func(x2, y1) * (x - x1)) / (x2 - x1);
}
return (
func(x1, y1) * (x2 - x) * (y2 - y) +
func(x2, y1) * (x - x1) * (y2 - y) +
func(x1, y2) * (x2 - x) * (y - y1) +
func(x2, y2) * (x - x1) * (y - y1)
)
/ ((x2 - x1) * (y2 - y1));
}