21 static inline void bspline_help(
const INT k,
const R x, R *scratch,
const INT j,
22 const INT ug,
const INT og,
const INT r)
29 for (i = og + r - k + 1, idx = og; idx >= ug; i--, idx--)
31 a = (x - (R)i) / ((R)(k - j));
32 scratch[idx] = (K(1.0) - a) * scratch[idx - 1] + a * scratch[idx];
37 R Y(bsplines)(
const INT k,
const R _x)
48 result_value = K(0.0);
50 if (K(0.0) < x && x < kk)
58 r = (INT)LRINT(CEIL(x) - K(1.0));
64 for (idx = 0; idx < k; idx++)
65 scratch[idx] = K(0.0);
67 scratch[k-r-1] = K(1.0);
76 for (j = 1, og = g2 + 1; j <= g1; j++, og++)
78 a = (x + (R)(k - r - og - 1)) / ((R)(k - j));
79 scratch[og] = (K(1.0) - a) * scratch[og-1];
80 bspline_help(k, x, scratch, j, ug + 1, og - 1, r);
81 a = (x + (R)(k - r - ug - 1)) / ((R)(k - j));
82 scratch[ug] = a * scratch[ug];
85 for (og-- ; j <= g2; j++)
87 bspline_help(k, x, scratch, j, ug + 1, og, r);
88 a = (x + (R)(k - r - ug - 1)) / ((R)(k - j));
89 scratch[ug] = a * scratch[ug];
95 bspline_help(k, x, scratch, j, ug, og, r);
98 result_value = scratch[k-1];
101 return(result_value);