# Interpolating Data Points On A Two Dimensional Regular Grid

This was a pain in the ass to figure out. So this method is for basic Bicubic interpolation, a principal based on cubic interpolation, targeted to be called to work with values and derivatives on that plain at any given point. The title of the post kind of says it all.

[cpp]

public: virtual Double __gc* CalcBiCubicInterpolation(Double __gc* __gc [] coeff __gc [], Double __gc* dir1Down, Double __gc* dir1Up, Double __gc* dir2Down, Double __gc* dir2Up, Double __gc* dir1, Double __gc* dir2) __gc []
{
Double __gc* numArray __gc [] = __gc new Double __gc*;
try
{
Double __gc* HD1 = 0;
Double __gc* HD2 = 0;
Double __gc* HD3 = 0;
Double __gc* evalDir1 = (dir1Up – dir1Down);
Double __gc* evalDir2 = (dir2Up – dir2Down);
Double __gc* finDirCalc1 = ((dir2Up – dir1Down) / evalDir1);
Double __gc* finDirCalc2 = ((dir2 – dir2Down) / evalDir2);
HD1 = Process(finDirCalc1, HD1, coeff, finDirCalc2, ref HD3, ref HD2);
HD2 /= evalDir1;
HD3 /= evalDir2;
numArray = __gc new Double __gc* {
HD1, HD2, HD3};
}
catch (ArithmeticException __gc* exception)
{
}
return numArray;
}

private: static Double __gc* Process(Double __gc* finDirCalc1, Double __gc* HD1, Double __gc* __gc [] coeff __gc [], Double __gc* finDirCalc2, Double __gc*& HD3, Double __gc*& HD2)
{
for (Int32 __gc* i = 3; (i >= 0); i–)
{
HD1 = (((finDirCalc1 * HD1) + (((((coeff[i] * finDirCalc2) + coeff[i]) * finDirCalc2) + coeff[i]) * finDirCalc2)) + coeff[i]);
HD3 = (((finDirCalc1 * HD3) + ((((3 * coeff[i]) * finDirCalc2) + (2 * coeff[i])) * finDirCalc2)) + coeff[i]);
HD2 = (((finDirCalc2 * HD2) + ((((3 * coeff[i]) * finDirCalc1) + (2 * coeff[i])) * finDirCalc1)) + coeff[i]);
}
return HD1;
}

[/cpp]

~~ These are the notes from my N.A. class @ UoM ~~