24 if (ix >= nx - 1) ix = nx - 2;
25 if (iy >= ny - 1) iy = ny - 2;
29 z00 = zs[ix * ny + iy];
30 z01 = zs[ix * ny + (iy + 1)];
31 z10 = zs[(ix + 1) * ny + iy];
32 z11 = zs[(ix + 1) * ny + (iy + 1)];
33 if (!isfinite(z00) || !isfinite(z01)) {
36 if (!isfinite(z10) || !isfinite(z11)) {
40 result = (1.0 - tx) * (1.0 - ty) * z00
41 + (1.0 - tx) * ty * z01
42 + tx * (1.0 - ty) * z10
44 if (!isfinite(result)) {
55 size_t start = interval > 0 ? interval - 1 : 0;
56 return start > n - 4 ? n - 4 : start;
66 for (i = 0; i < 4; ++i) {
68 for (j = 0; j < 4; ++j) basis[j] = i == j ? 1.0 : 0.0;
76 for (i = 0; i < 4; ++i) {
79 log(fabs(difference)) :
80 log(fabs(q / 2.0 - nodes[i] / 2.0)) + log(2.0);
81 log_terms[i] = log(fabs(basis[i])) - log_distance;
82 if (log_terms[i] > largest) largest = log_terms[i];
84 for (i = 0; i < 4; ++i) {
86 basis[i] = copysign(exp(log_terms[i] - largest), basis[i]) *
87 (difference < 0.0 ? -1.0 : 1.0);
88 denominator += basis[i];
90 if (denominator == 0.0 || !isfinite(denominator)) {
93 for (i = 0; i < 4; ++i) basis[i] /= denominator;
98static int interp_grid_values_finite(
const interp_grid_t* grid,
102 for (i = 0; i < 4; ++i) {
116 for (i = 0; i < 4; ++i) {
118 for (j = 0; j < 4; ++j) {
119 row += by[j] * grid->
zs[(ix + i) * grid->
ny + iy + j];
120 if (!isfinite(row)) {
124 result += bx[i] * row;
125 if (!isfinite(result)) {
146 ix = interp_grid_stencil(xs, nx, qx);
147 iy = interp_grid_stencil(ys, ny, qy);
148 if (!interp_grid_values_finite(&grid, ix, iy)) {
151 status = interp_grid_basis(xs + ix, qx, bx);
155 status = interp_grid_basis(ys + iy, qy, by);
159 return interp_grid_tensor_product(&grid, ix, iy, bx, by, out_z);
double lmmc_real_t
Public and internal LMMC real type.
lmmc_status_t lmmc_interp_bicubic(const lmmc_real_t *xs, size_t nx, const lmmc_real_t *ys, size_t ny, const lmmc_real_t *zs, lmmc_real_t qx, lmmc_real_t qy, lmmc_real_t *out_z)
双三次插值(矩形网格).
lmmc_status_t lmmc_interp_bilinear(const lmmc_real_t *xs, size_t nx, const lmmc_real_t *ys, size_t ny, const lmmc_real_t *zs, lmmc_real_t qx, lmmc_real_t qy, lmmc_real_t *out_z)
双线性插值(矩形网格).
lmmc_status_t interp_check_grid(const interp_grid_t *grid, size_t minimum, const lmmc_real_t *out)
size_t interp_find_interval(const lmmc_real_t *xs, size_t n, lmmc_real_t query_x)
int interp_check_finite_values(const lmmc_real_t *values, size_t n)
lmmc_real_t interp_interval_fraction(lmmc_real_t left, lmmc_real_t right, lmmc_real_t query)
lmmc_status_t interp_barycentric_weights(const lmmc_real_t *nodes, size_t n, lmmc_real_t *weights)
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_INVALID_ARGUMENT