核心代码:
//////////////////////////////////////////////////////////////////////
// 埃尔米特等距插值
//////////////////////////////////////////////////////////////////////
static float GetValueHermite(const void* valuesPtr, int stride, int n, float t, float dc)
{
int i,j;
float z,s,p,q, v, d; // 初值
z = 0.0; // 特例处理
if (n < )
{
return(z);
}
if (n == )
{
z = YfGetFloatValue(valuesPtr, stride, );
return(z);
} float xStep = 1.0f/(n - ); // 循环插值
for (i = ; i <= n; i++)
{
s = 1.0f;
q = (i-)*xStep; for (j = ; j <= n; j++)
{
p = (j-)*xStep;
if (j != i)
{
s = s*(t-p)/(q-p);
}
} s = s*s;
p = 0.0f; for (j = ; j <= n; j++)
{
if (j != i)
{
p = p+1.0f/(q-((j-)*xStep));
}
} v = YfGetFloatValue(valuesPtr, stride, i - );
if (i < n)
{
d = YfGetFloatValue(valuesPtr, stride, i) - v;
}
else
{
d = v - YfGetFloatValue(valuesPtr, stride, i - );
} q = v + (t-q)*(d*dc-2.0f*v*p);
z = z + q*s;
} return(z);
}
切图:
相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip