您的位置:首页 > 其它

样条之埃尔米特(Hermite)插值函数

2014-10-18 13:42 246 查看
核心代码:

//////////////////////////////////////////////////////////////////////
// 埃尔米特等距插值
//////////////////////////////////////////////////////////////////////
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 < 1)
{
return(z);
}
if (n == 1)
{
z = YfGetFloatValue(valuesPtr, stride, 0);
return(z);
}

float xStep = 1.0f/(n - 1);

// 循环插值
for (i = 1; i <= n; i++)
{
s = 1.0f;
q = (i-1)*xStep;

for (j = 1; j <= n; j++)
{
p = (j-1)*xStep;
if (j != i)
{
s = s*(t-p)/(q-p);
}
}

s = s*s;
p = 0.0f;

for (j = 1; j <= n; j++)
{
if (j != i)
{
p = p+1.0f/(q-((j-1)*xStep));
}
}

v = YfGetFloatValue(valuesPtr, stride, i - 1);
if (i < n)
{
d = YfGetFloatValue(valuesPtr, stride, i) - v;
}
else
{
d = v - YfGetFloatValue(valuesPtr, stride, i - 2);
}

q = v + (t-q)*(d*dc-2.0f*v*p);
z = z + q*s;
}

return(z);
}


切图:





相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: