private double interpolate(double x, double y,
byte h1, byte h2, byte h3, byte h4, byte h5, byte h6,
byte h7, byte h8, byte h9, byte h10, byte h11, byte h12)
{
//An absolutely ridiculous polynomial spline. Works on the skewed grid so it has nice coefficients.
//Could probably be optimized a bit if the compiler doesn't already do it.
double value = (h1/2.0 - h4/3.0 - h5 + h8/2.0 - h3/2.0 + h6 + h7/3.0 - h10/2.0)*x*x*x*x*x
+ ((4*h4)/3.0 - (4*h1)/3.0 + h2/6.0 + 2*h5 - (4*h8)/3.0 + (7*h3)/6.0 - 3*h6 + h9/6.0
- h7/3.0 + (7*h10)/6.0 - y*((5*h1)/6.0 - (5*h4)/6.0 + (5*h2)/6.0 - (5*h5)/2.0 + (5*h8)/3.0
- (5*h3)/3.0 + (5*h6)/2.0 - (5*h9)/6.0 + (5*h7)/6.0 - (5*h10)/6.0))*x*x*x*x + (((5*h2)/3.0
- (10*h5)/3.0 + (5*h8)/3.0 - (5*h3)/3.0 + (10*h6)/3.0 - (5*h9)/3.0)*y*y + ((8*h1)/3.0
- (8*h4)/3.0 + (4*h2)/3.0 - 4*h5 + (8*h8)/3.0 - 4*h3 + 6*h6 - 2*h9 + (2*h7)/3.0 - (2*h10)/3.0)*y
+ h1 - 2*h4 - h2/3.0 + (2*h5)/3.0 + h8 - (2*h3)/3.0 + (4*h6)/3.0 - h9/3.0 - (2*h10)/3.0)*x*x*x
+ (((5*h5)/3.0 - (5*h8)/3.0 - (10*h6)/3.0 + (10*h9)/3.0 + (5*h7)/3.0 - (5*h10)/3.0)*y*y*y
+ (5*h5- 5*h2 + 5*h3 - 5*h6)*y*y + (3*h4 - 3*h1 + h2 - h5 + 2*h3 - 2*h6)*y + (4*h4)/3.0
- (8*h5)/3.0 + (4*h6)/3.0)*x*x + (((5*h8)/3.0 - (5*h5)/6.0 - (5*h2)/6.0 + (5*h3)/6.0
+ (5*h6)/2.0 - (5*h9)/2.0 - (5*h11)/6.0 - (5*h7)/3.0 + (5*h10)/6.0 + (5*h12)/6.0)*y*y*y*y
+ ((8*h2)/3.0 - 2*h5 - (2*h8)/3.0 - (8*h3)/3.0 + (8*h6)/3.0 - (2*h9)/3.0 + (2*h11)/3.0
- (2*h7)/3.0 + (4*h10)/3.0 - (2*h12)/3.0)*y*y*y + (2*h2 + h5 - 3*h8 - 2*h3 - h6 + 3*h9)*y*y
+ ((4*h1)/3.0 - (4*h4)/3.0 - (4*h2)/3.0 + (8*h5)/3.0 - (4*h8)/3.0 - (4*h6)/3.0 + (4*h9)/3.0)*y
- h1/6.0 - h4/3.0 + h2/6.0 - h8/6.0 + h6/3.0 + h9/6.0)*x + (h2/2.0 - h8/2.0 - h3/3.0 - h6 + h9
+ h11/3.0 + h7/2.0 - h12/2.0)*y*y*y*y*y + (h5 - h2/2.0 - h8/2.0 + h3/2.0 - h6/2.0 - h9/2.0
+ h11/2.0 + h7/3.0 - (2*h10)/3.0 + h12/3.0)*y*y*y*y + ((5*h8)/3.0 - (5*h2)/3.0 + (2*h3)/3.0
+ (4*h6)/3.0 - (4*h9)/3.0 - (2*h11)/3.0)*y*y*y + ((4*h2)/3.0 - (8*h5)/3.0 + (4*h8)/3.0)*y*y
+ (h4/6.0 - h1/6.0 - h2/3.0 + h8/3.0 - h6/6.0 + h9/6.0)*y + h5;
return value;
}