核心代码:
1 //
2 // Akima光滑插值
3 // t - 存放指定的插值点的值
4 // s[] - 一维数组,长度为5,其中s(0),s(1),s(2),s(3)返回三次多项式的系数,
5 // s(4)返回指定插值点t处的函数近似值f(t)(k<0时)或任意值(k>=0时)
6 // k - 控制参数,若k>=0,则只计算第k个子区间[x(k), x(k+1)]上的三次多项式的系数
7 //
8 static float GetValueAkima(const void* valuesPtr, int stride, int n, float t, float* s, int k)
9 {
10 int kk,m,l;
11 float u[5],p,q;
12
13 // 初值
14 memset(s, 0, 5*sizeof(float));
15
16 // 特例处理
17 if (n < 1)
18 {
19 return s[4];
20 }
21 if (n == 1)
22 {
23 s[4] = YfGetFloatValue(valuesPtr, stride, 0);
24 s[0] = s[4];
25 return s[4];
26 }
27
28 float xStep = 1.0f/(n - 1);
29
30 if (n == 2)
31 {
32 float y0 = YfGetFloatValue(valuesPtr, stride, 0);
33 float y1 = YfGetFloatValue(valuesPtr, stride, 1);
34 s[0] = y0;
35 s[1] = (y1-y0)/xStep;
36 s[