projection = ([x, y]) => {
const x0 = clamp(Math.floor(x), 0, n - 1),
dx = x - x0;
const x1 = clamp(Math.ceil(x), 0, n - 1),
rx = dx / (x1 - x);
const y0 = clamp(Math.floor(y), 0, m - 1),
dy = y - y0;
const y1 = clamp(Math.ceil(y), 0, m - 1),
ry = dy / (y1 - y);
const qx = i(
i(grid.X[x0 + n * y0], grid.X[x1 + n * y0], rx),
i(grid.X[x0 + n * y1], grid.X[x1 + n * y1], rx),
ry
);
const qy = i(
i(grid.Y[x0 + n * y0], grid.Y[x0 + n * y1], ry),
i(grid.Y[x1 + n * y0], grid.Y[x1 + n * y1], ry),
rx
);
return [qx, qy];
function i(a, b, r) {
return a === b ? a : (a + b * r) / (r + 1);
}
function clamp(x, lo, hi) {
return x < lo ? lo : x > hi ? hi : x;
}
}