87 double const binrange,
94 double const w1 = ( 1.0f - xd ) * ( 1.0
f - yd );
95 double const w2 = xd * ( 1.0f - yd );
96 double const w3 = ( 1.0f - xd ) * yd;
97 double const w4 = xd * yd;
105 double const w12 = w1 + w2;
113 double const w34 = w3 + w4;
127 val = x0y0 * w1 + x1y0 * w2 + x0y1 * w3 + x1y1 * w4;
129 dval_dx = ( ( 1.0f - yd ) * ( x1y0 - x0y0 ) + yd * ( x1y1 - x0y1 ) ) / binrange;
130 dval_dy = ( ( 1.0f - xd ) * ( x0y1 - x0y0 ) + xd * ( x1y1 - x1y0 ) ) / binrange;
161 double const binrange,
169 double const w1 = ( 1.0f - xd ) * ( 1.0
f - yd ) * ( 1.0f -zd );
170 double const w2 = xd * ( 1.0f - yd ) * ( 1.0
f -zd );
171 double const w3 = ( 1.0f - xd ) * yd * ( 1.0
f -zd );
172 double const w4 = ( 1.0f - xd ) * ( 1.0
f - yd ) * zd;
173 double const w5 = xd * yd * ( 1.0f -zd );
174 double const w6 = xd * ( 1.0f - yd ) * zd;
175 double const w7 = ( 1.0f - xd ) * yd * zd;
176 double const w8 = xd * yd * zd;
180 val = x0y0z0 * w1 + x1y0z0 * w2 + x0y1z0 * w3 + x0y0z1 * w4 + x1y1z0 * w5 + x1y0z1 * w6 + x0y1z1 * w7 + x1y1z1 * w8;
181 dval_dx = ( -1.0f * x0y0z0 * ( 1.0f - yd ) * ( 1.0
f - zd ) + x1y0z0 * ( 1.0f - yd ) * ( 1.0
f - zd ) - x0y1z0 * yd * ( 1.0f - zd ) + x1y0z1 * yd * ( 1.0
f - zd ) - x1y0z1 * ( 1.0f - yd ) * zd + x1y0z0 * ( 1.0
f - yd ) * zd - x1y0z0 * yd * zd + x1y1z1 * yd * zd ) / binrange;
182 dval_dy = ( -1.0f * x0y0z0 * ( 1.0f - xd ) * ( 1.0
f - zd ) + x0y1z0 * ( 1.0f - xd ) * ( 1.0
f - zd ) - x1y0z0 * xd * ( 1.0f - zd ) + x1y0z1 * xd * ( 1.0
f - zd ) - x1y0z1 * ( 1.0f - xd ) * zd + x1y0z0 * ( 1.0
f - xd ) * zd - x1y0z0 * xd * zd + x1y1z1 * xd * zd ) / binrange;
183 dval_dz = ( -1.0f * x0y0z0 * ( 1.0f - xd ) * ( 1.0
f - yd ) + x1y0z1 * ( 1.0f - xd ) * ( 1.0
f - yd ) - x1y0z0 * xd * ( 1.0f - yd ) + x1y0z0 * xd * ( 1.0
f - yd ) - x0y1z0 * ( 1.0f - xd ) * yd + x1y0z0 * ( 1.0
f - xd ) * yd - x1y0z1 * xd * yd + x1y1z1 * xd * yd ) / binrange;
186 val = x0y0z0 * w1 + x1y0z0 * w2 + x0y1z0 * w3 + x0y0z1 * w4 + x1y0z1 * w5 + x0y1z1 * w6 + x1y1z0 * w7 + x1y1z1 * w8;
187 dval_dx = ( -1.0f * x0y0z0 * ( 1.0f - yd ) * ( 1.0
f - zd ) + x1y0z0 * ( 1.0f - yd ) * ( 1.0
f - zd ) - x0y1z0 * yd * ( 1.0f - zd ) + x1y0z1 * yd * ( 1.0
f - zd ) - x1y0z1 * ( 1.0f - yd ) * zd + x1y0z0 * ( 1.0
f - yd ) * zd - x1y0z0 * yd * zd + x1y1z1 * yd * zd ) / binrange;
188 dval_dy = ( -1.0f * x0y0z0 * ( 1.0f - xd ) * ( 1.0
f - zd ) + x0y1z0 * ( 1.0f - xd ) * ( 1.0
f - zd ) - x1y0z0 * xd * ( 1.0f - zd ) + x1y0z1 * xd * ( 1.0
f - zd ) - x1y0z1 * ( 1.0f - xd ) * zd + x1y0z0 * ( 1.0
f - xd ) * zd - x1y0z0 * xd * zd + x1y1z1 * xd * zd ) / binrange;
189 dval_dz = ( -1.0f * x0y0z0 * ( 1.0f - xd ) * ( 1.0
f - yd ) + x1y0z1 * ( 1.0f - xd ) * ( 1.0
f - yd ) - x1y0z0 * xd * ( 1.0f - yd ) + x1y0z0 * xd * ( 1.0
f - yd ) - x0y1z0 * ( 1.0f - xd ) * yd + x1y0z0 * ( 1.0
f - xd ) * yd - x1y0z1 * xd * yd + x1y1z1 * xd * yd ) / binrange;
void interpolate_trilinear_by_value(double const x0y0z0, double const x1y0z0, double const x0y1z0, double const x1y1z0, double const x0y0z1, double const x1y0z1, double const x0y1z1, double const x1y1z1, double const xd, double const yd, double const zd, double const binrange, bool const angles, double &val, double &dval_dx, double &dval_dy, double &dval_dz)
paraphazed from above for three dimentions Without additional scaling this will only work if the bin ...
double subtract_degree_angles(double a, double b)
subtract angles in degrees, restricting the range of the result
void interpolate_bilinear_by_value(double const x0y0, double const x1y0, double const x0y1, double const x1y1, double const xd, double const yd, double const binrange, bool const angles, double &val, double &dval_dx, double &dval_dy)
get bilinear interpolate, given four points of a 2d periodic function
void angle_in_range(double &ang)
taken from wobble.cc