• 样条之连分式插值函数


    核心代码:

     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 }

    切图:

     

     

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

  • 相关阅读:
    Python三维绘图--Matplotlib colorbar生成
    Python三维绘图--Matplotlib
    VIM剪切板的使用
    三维点云网络PointNet——模型及代码分析
    ECCV2018--点云匹配
    hdu 1905 小数化分数2
    hdu 1755 A Number Puzzle
    hdu 1796 How many integers can you find
    hdu 1452 Happy 2004
    hdu 2837 Calculation
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/4020415.html
Copyright © 2020-2023  润新知