随笔 - 373  文章 - 1  评论 - 771  阅读 - 137万

样条之连分式插值函数

 

核心代码:

复制代码
 1 //////////////////////////////////////////////////////////////////////
 2 // 连分式等距插值
 3 //////////////////////////////////////////////////////////////////////
 4 static float GetValuePqs(const void* valuesPtr, int stride, int n, float t)
 5 { 
 6     int i,j,k,m, l;
 7     float z,hh,xi,xj;
 8     float b[8];
 9 
10     // 初值
11     z = 0.0;
12 
13     // 特例处理
14     if (n < 1) 
15     {
16         return(z);
17     }
18     if (n == 1) 
19     { 
20         z = YfGetFloatValue(valuesPtr, stride, 0);  
21         return(z);
22     }
23     if (n == 2)
24     { 
25         float y0 = YfGetFloatValue(valuesPtr, stride, 0); 
26         float y1 = YfGetFloatValue(valuesPtr, stride, 1); 
27         z = y0 + (y1 - y0)*t;
28         return(z);
29     }
30 
31     float xStep = 1.0f/(n - 1);
32 
33     // 连分式插值
34     if (n <= 8) 
35     { 
36         k = 0; 
37         m = n;
38     }
39     else if (t < (4.0f*xStep)) 
40     { 
41         k=0; 
42         m=8;
43     }
44     else if (t > ((n-5)*xStep)) 
45     { 
46         k = n-8; 
47         m = 8;
48     }
49     else 
50     { 
51         k = (int)(t/xStep)-3; 
52         m = 8;
53     }
54 
55     b[0] = YfGetFloatValue(valuesPtr, stride, k); 
56     for (i = 2; i <= m; i++)
57     { 
58         hh = YfGetFloatValue(valuesPtr, stride, i+k-1); 
59         l = 0; 
60         j = 1;
61 
62         while ((l == 0) && (j <= i-1))
63         { 
64             if (fabs(hh-b[j-1])+1.0f == 1.0f) 
65             {
66                 l = 1;
67             }
68             else
69             { 
70                 xi = (i+k-1)*xStep;
71                 xj = (j+k-1)*xStep;
72                 hh = (xi-xj)/(hh-b[j-1]);
73             }
74 
75             j = j+1;
76         }
77 
78         b[i-1]=hh;
79         if (l != 0) 
80         {
81             b[i-1] = 1.0e+35F;
82         }
83     }
84 
85     z = b[m-1];
86     for (i = m-1; i >= 1; i--)
87     {
88         z = b[i-1]+(t-(i+k-1)*xStep)/z;
89     }
90 
91     return(z);
92 }
复制代码

切图:

 

 

相关软件的下载地址为:https://files.cnblogs.com/WhyEngine/TestSpline.zip

posted on   叶飞影  阅读(1446)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示