它是根據給定結點上的數值,用拋物插值計算指定插值點處的函數。一元三點插值算法是一種精度更高的插值算法,使用這種方法插值出來的曲線不像線性插值算法那樣在分段點的地方出現折點,顯得更為平滑。但它是使用二次函數來進行曲線的擬合,曲線中還是會有不平滑的情況。
關於插值與樣條的介紹請看:http://www.cnblogs.com/WhyEngine/p/4020294.html
核心代碼:
////////////////////////////////////////////////////////////////////// // 一元三點等距插值 ////////////////////////////////////////////////////////////////////// static float GetValueParabolic(const void* valuesPtr, int stride, int n, float t) { int i,j,k,m; float z,s,xi,xj; // 初值 z=0.0; // 特例處理 if (n < 1) { return(z); } if (n == 1) { z = YfGetFloatValue(valuesPtr, stride, 0); return(z); } if (n == 2) { float y0 = YfGetFloatValue(valuesPtr, stride, 0); float y1 = YfGetFloatValue(valuesPtr, stride, 1); z = y0 + (y1 - y0)*t; return(z); } float xStep = 1.0f/(n - 1); // 開始插值 if (t <= xStep) { k = 0; m = 2; } else if (t >= (n-3)*xStep) { k = n-3; m = n-1; } else { i = (int)(t/xStep)+1; if (fabs(t-i*xStep) >= fabs(t-(i-1)*xStep)) { k = i-2; m = i; } else { k = i-1; m = i+1; } } z = 0.0f; for (i = k; i <= m; i++) { s = 1.0f; xi = i*xStep; for (j = k; j <= m; j++) { if (j != i) { xj = j*xStep; // 拋物線插值公式 s = s*(t-xj)/(xi-xj); } } z = z + s*YfGetFloatValue(valuesPtr, stride, i); } return(z); }
切圖:
相關軟件的下載地址為:http://files.cnblogs.com/WhyEngine/TestSpline.zip
……