样条之Akima光滑插值函数
核心代码:
//////////////////////////////////////////////////////////////////////
// Akima光滑插值
// t - 存放指定的插值点的值
// s[] - 一维数组,长度为5,其中s(0),s(1),s(2),s(3)返回三次多项式的系数,
// s(4)返回指定插值点t处的函数近似值f(t)(k<0时)或任意值(k>=0时)
// k - 控制参数,若k>=0,则只计算第k个子区间[x(k), x(k+1)]上的三次多项式的系数
//////////////////////////////////////////////////////////////////////
static float GetValueAkima(const void* valuesPtr, int stride, int n, float t, float* s, int k)
{
int kk,m,l;
float u[],p,q; // 初值
memset(s, , *sizeof(float)); // 特例处理
if (n < )
{
return s[];
}
if (n == )
{
s[] = YfGetFloatValue(valuesPtr, stride, );
s[] = s[];
return s[];
} float xStep = 1.0f/(n - ); if (n == )
{
float y0 = YfGetFloatValue(valuesPtr, stride, );
float y1 = YfGetFloatValue(valuesPtr, stride, );
s[] = y0;
s[] = (y1-y0)/xStep;
s[] = y0 + (y1 - y0)*t;
return s[];
} // 插值
if (k<)
{
if (t <= xStep)
kk = ;
else if (t >= (n-)*xStep)
kk = n-;
else
{
kk = ;
m = n;
while (((kk-m)!=)&&((kk-m)!=-))
{
l=(kk+m)/;
if (t < (l-)*xStep)
m=l;
else
kk=l;
} kk=kk-;
}
}
else
kk=k; if (kk>=n-)
kk=n-; u[]=(YfGetFloatValue(valuesPtr, stride, kk+) - YfGetFloatValue(valuesPtr, stride, kk))/xStep;
if (n==)
{
if (kk==)
{
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
}
else
{
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
}
}
else
{
if (kk<=)
{
u[]=(YfGetFloatValue(valuesPtr, stride, kk+) - YfGetFloatValue(valuesPtr, stride, kk+))/xStep;
if (kk==)
{
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
u[]=2.0f*u[]-u[];
if (n==)
u[]=2.0f*u[]-u[];
else
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
}
else
{
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
u[]=(YfGetFloatValue(valuesPtr, stride, ) - YfGetFloatValue(valuesPtr, stride, ))/xStep;
}
}
else if (kk>=(n-))
{
u[]=(YfGetFloatValue(valuesPtr, stride, kk) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
if (kk==(n-))
{
u[]=(YfGetFloatValue(valuesPtr, stride, n-) - YfGetFloatValue(valuesPtr, stride, n-))/xStep;
u[]=2.0f*u[]-u[];
if (n==)
u[]=2.0f*u[]-u[];
else
u[]=(YfGetFloatValue(valuesPtr, stride, kk-) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
}
else
{
u[]=2.0f*u[]-u[];
u[]=2.0f*u[]-u[];
u[]=(YfGetFloatValue(valuesPtr, stride, kk-) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
}
}
else
{
u[]=(YfGetFloatValue(valuesPtr, stride, kk ) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
u[]=(YfGetFloatValue(valuesPtr, stride, kk-) - YfGetFloatValue(valuesPtr, stride, kk-))/xStep;
u[]=(YfGetFloatValue(valuesPtr, stride, kk+) - YfGetFloatValue(valuesPtr, stride, kk+))/xStep;
u[]=(YfGetFloatValue(valuesPtr, stride, kk+) - YfGetFloatValue(valuesPtr, stride, kk+))/xStep;
}
} s[] = fabs(u[]-u[]);
s[] = fabs(u[]-u[]);
if ((s[]+1.0f == 1.0f) && (s[]+1.0f == 1.0f))
p = (u[]+u[])/2.0f;
else
p = (s[]*u[]+s[]*u[])/(s[]+s[]); s[] = fabs(u[]-u[]);
s[] = fabs(u[]-u[]);
if ((s[]+1.0f==1.0f) && (s[]+1.0f==1.0f))
q = (u[]+u[])/2.0f;
else
q = (s[]*u[]+s[]*u[])/(s[]+s[]); s[] = YfGetFloatValue(valuesPtr, stride, kk);
s[] = p;
s[] = xStep;
s[] = (3.0f*u[]-2.0f*p-q)/s[];
s[] = (q+p-2.0f*u[])/(s[]*s[]); //if (k<0)
{
p=t-(kk*xStep);
s[]=s[]+s[]*p+s[]*p*p+s[]*p*p*p;
} return s[]; }
切图:
 、
、

相关软件的下载地址为:http://files.cnblogs.com/WhyEngine/TestSpline.zip
样条之Akima光滑插值函数的更多相关文章
- 样条之埃尔米特(Hermite)插值函数
		核心代码: ////////////////////////////////////////////////////////////////////// // 埃尔米特等距插值 /////////// ... 
- Matlab hermite
		保形分段三次hermite插值 % 这是MATLAB里面的pchip.m文件.这里把它的凝视改写成汉语,主要是想弄清楚它是怎么计算在节点处的导数的. function v = pchip(x,y,xx ... 
- python scipy样条插值函数大全(interpolate里interpld函数)
		scipy样条插值 scipy样条插值1.样条插值法是一种以可变样条来作出一条经过一系列点的光滑曲线的数学方法.插值样条是由一些多项式组成的,每一个多项式都是由相邻的两个数据点决定的,这样,任意的两个 ... 
- 样条之拉格朗日Lagrange(一元全区间)插值函数
		这是使用拉格朗日插值函数生成的样条曲线.在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法.许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过 ... 
- 样条之EHMT插值函数
		核心代码: ////////////////////////////////////////////////////////////////////// // 埃特金插值 ////////////// ... 
- 样条之埃特金(Aitken)逐步插值函数
		核心代码: ////////////////////////////////////////////////////////////////////// // 埃特金逐步插值 //////////// ... 
- Matlab插值函数
		x=0:2*pi; y=sin(x); xx=0:0.5:2*pi; %interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值 y1=interp1(x,y,xx) ... 
- B样条基函数的定义及系数的意义
		原文链接:http://blog.csdn.net/tuqu/article/details/5177405 贝塞尔基函数用作权重.B-样条基函数也一样:但更复杂.但是它有两条贝塞尔基函数所没有的特性 ... 
- [转载]Matlab中插值函数汇总和使用说明
		http://blog.sciencenet.cn/blog-457143-679275.html MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,' ... 
随机推荐
- 【BZOJ 3620】 3620: 似乎在梦中见过的样子 (KMP)
			3620: 似乎在梦中见过的样子 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 755 Solved: 445 Description “Madok ... 
- hadoop 基础视频1
			hadoop 基础视频1 一, 大致内容: 1, 源起与体系结构2,实施Hadoop 集群3,分布式HDFS, 大数据存储实战4,Map-Reduce 体系架构5,Map-Reduce 数据分析之一 ... 
- 2017-2018-2 20172302 『Java程序设计』课程 结对编程练习_四则运算
			1.结对对象 20172308周亚杰 2.本周内容 需求分析 (1).自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能) 可生成不同等级题目,类似于: 1级题目:2 + 5 = .10 ... 
- OpenNI2 + NiTE2开发教程
			发现了一个非常不错的关于自然交互OpeNI2+NiTE2的资源,非常感谢Heresy,这里分享链接: OpenNI 2.x 教学文章(转载自:Heresy博客,地址:https://kheresy.w ... 
- OS X - 在80端口启动Nginx
			不知道你是怎么在你的mac上安装nginx的,但是如果你跟我一样: brew install nginx 然后你会发现你的nginx.conf中的端口是8080. 于是你可能像我一样试着把端口改为80 ... 
- c# 实现获取汉字十六进制Unicode编码字符串
			1. 汉字转十六进制UNICODE编码字符串 /// <summary> /// //// /// </summary> /// & ... 
- IAR EWARM : Debugging with CMSIS-DAP
- VirtualBox 在WIN7 X64 安装报错  获取VirtualBox COM对象失败,Unable to start the virtual device
			Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\CLSID\{---C000-}\InprocServer32] @="C:\ ... 
- Revit API遍历全部风管,找到与风管相关的墙开洞
			涉及向量计算,求相交等相关技术. ) { foreach (Face face in solid.Faces) ... 
- delphi:临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别
			临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别 TRtlCriticalSection 是一个结构体,在windows单元中定义: 是I ... 
