样条之连分式插值函数
核心代码:
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?