样条之EHMT插值函数
核心代码:
1 ////////////////////////////////////////////////////////////////////// 2 // 埃特金插值 3 ////////////////////////////////////////////////////////////////////// 4 static float GetValueEhmt(const void* valuesPtr, int stride, int n, float t, float dc) 5 { 6 int i,j; 7 float z,s,p,q,v,d; 8 9 // 初值 10 z = 0.0f; 11 12 // 特例处理 13 if (n < 1) 14 { 15 return(z); 16 } 17 if (n == 1) 18 { 19 z = YfGetFloatValue(valuesPtr, stride, 0); 20 return(z); 21 } 22 23 float h = 1.0f/(n - 1); 24 25 for (i = 1; i <= n; i++) 26 { 27 s = 1.0; 28 q = (i-1)*h; 29 for (j = 1; j <= n; j++) 30 { 31 p = (j-1)*h; 32 if (j != i) 33 { 34 s = s*(t-p)/(q-p); 35 } 36 } 37 38 s = s*s; 39 p = 0.0f; 40 for (j = 1; j <= n; j++) 41 { 42 if (j != i) 43 { 44 p = p+1.0f/(q-(j-1)*h); 45 } 46 } 47 48 v = YfGetFloatValue(valuesPtr, stride, i - 1); 49 if (i < n) 50 { 51 d = YfGetFloatValue(valuesPtr, stride, i) - v; 52 } 53 else 54 { 55 d = v - YfGetFloatValue(valuesPtr, stride, i - 2); 56 } 57 58 q = v + (t-q)*(d*dc-2.0f*v*p); 59 z = z + q*s; 60 } 61 62 return(z); 63 }
切图:
相关软件的下载地址为:https://files.cnblogs.com/WhyEngine/TestSpline.zip