样条之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,' ...
随机推荐
- 015.Zabbix的日志监控配置
一 日志监控概述 Zabbix可用于集中监控和分析日志,支持有日志轮询的日志监控分析.当日志中出现相关警告信息(如警告.报错等),可以发送通知给用户.日志监控功能,必须满足以下两个条件: Zabbix ...
- 安装redis时候的坑
安装redis时候的坑 随手记录一下,以此为借鉴. 1.按照需求下载redis服务 redis可视化文件 2.安装及环境搭建 修改服务里redis.windows-service.conf文件,或者r ...
- [代码审计]covercms 后台getshell
0x00 环境介绍 CMS名称: covercms 运行环境: php 5.6.27-nts + apache + mysql 系统版本: 1.16 漏洞等级:高危 漏洞简介: 后台awnotas.i ...
- 子类 父类强转 HttpServlet service实现
相当于 走父类 临时走了一趟 HttpServletRequest ->ServletRequets -> HttpServeltRequest /* */ public void ser ...
- iOS 11开发教程(十六)iOS11应用视图之删除空白视图
iOS 11开发教程(十六)iOS11应用视图之删除空白视图 当开发者不再需要主视图的某一视图时,可以将该视图删除.实现此功能需要使用到removeFromSuperview()方法,其语法形式如下: ...
- [ 转载 ] Tcp三次握手和四次挥手详解
#TCP的报头: 源端口号:表示发送端端口号,字段长为16位.目标端口号:表示接收端口号,字段长为16位.序列号:表示发送数据的位置,字段长为32位.每发送一次数据,就累加一次该数据字节数的大小.注意 ...
- BZOJ.3994.[SDOI2015]约数个数和(莫比乌斯反演)
题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^md(ij)\] \(Solution\) 有结论:\[d(nm)=\sum_{i|d}\sum_{j|d ...
- Codeforces Round #369 (Div. 2) A. Bus to Udayland 水题
A. Bus to Udayland 题目连接: http://www.codeforces.com/contest/711/problem/A Description ZS the Coder an ...
- OSX下面用ffmpeg抓取桌面以及摄像头推流进行直播
参考博客 http://blog.chinaunix.net/uid-11344913-id-4665455.html 在osx系统下通过ffmpeg查看设备 ffmpeg -f avfoundati ...
- .net core在Linux ARM板上运行
最近接了个临时任务,给别的项目组的机器人平台上开发个小程序,那机器人上跑的是ARM平台,ubuntu的系统. 本来打算用C++写的,由于最近用.net core较多,鉴于其在linux平台良好的兼容性 ...