核心代码:
//////////////////////////////////////////////////////////////////////
// 埃特金逐步插值
//////////////////////////////////////////////////////////////////////
static float GetValueAitken(const void* valuesPtr, int stride, int n, float t, float eps)
{
int i,j,k,m,l;
float z,xx[],yy[]; // 初值
z = 0.0f; // 特例处理
if (n < )
{
return(z);
}
if (n == )
{
z = YfGetFloatValue(valuesPtr, stride, );
return(z);
} float xStep = 1.0f/(n - ); // 开始插值
m=;
if (m > n)
{
m = n;
} if (t <= 0.0f)
{
k = ;
}
else if (t >= (n-)*xStep)
{
k = n;
}
else
{
k = ;
j = n; while ((k-j != ) && (k-j != -))
{
l = (k+j)/; if (t < (l-)*xStep)
j = l;
else
k = l;
} if (fabs(t-((l-)*xStep)) > fabs(t-(j-)*xStep))
{
k = j;
}
} j = ;
l = ;
for (i = ; i <= m; i++)
{
k = k+j*l;
if ((k<) || (k>n))
{
l = l+;
j = -j;
k = k+j*l;
} xx[i-] = (k-)*xStep;
yy[i-] = YfGetFloatValue(valuesPtr, stride, k - );
l = l+;
j = -j;
} i = ;
do
{
i = i+;
z = yy[i]; for (j = ; j <= i-; j++)
{
z = yy[j]+(t-xx[j])*(yy[j]-z)/(xx[j]-xx[i]);
} yy[i] = z;
}
while ((i != m-) && (fabs(yy[i]-yy[i-]) > eps)); return(z);
}
切图:
相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip