34 onebasisfun (FLT
const u, INT
const p, ITERATOR
const Ubegin, ITERATOR
const Uend) {
36 const FLT Umin = *(std::min_element (Ubegin, Uend));
37 const FLT Umax = *(std::max_element (Ubegin, Uend));
40 if (u >= Umin && u <= Umax) {
47 if (u < *std::next(Ubegin, 1)) {
48 N =
ratio ((u - *Ubegin),
49 (*std::next(Ubegin) - *Ubegin));
52 N =
ratio ((*std::next(Ubegin, 2) - u),
53 (*std::next(Ubegin, 2) - *std::next(Ubegin)));
59 const FLT ln = u - *Ubegin;
60 const FLT dn = *std::next(Ubegin, 3) - u;
61 const FLT ld = *std::next(Ubegin, 2) - *Ubegin;
62 const FLT dd = *std::next(Ubegin, 3) - *std::next(Ubegin);
64 if (u < *std::next (Ubegin)) {
65 N =
ratio (ln*ln, ld * (*std::next (Ubegin) - *Ubegin));
67 else if (u > *std::next (Ubegin, 2)) {
69 (dd * (*std::next (Ubegin, 3) - *std::next (Ubegin, 2))));
73 N +=
ratio (ln * (*std::next(Ubegin, 2) - u),
74 ((*std::next(Ubegin, 2) - *std::next(Ubegin, 1)) * ld));
77 N +=
ratio (dn * (u - *std::next(Ubegin, 1)),
78 ((*std::next(Ubegin, 2) - *std::next(Ubegin, 1)) * dd));
85 const FLT ld = *std::next (Uend, - 2) - *Ubegin;
86 const FLT dd = *std::prev (Uend) - *std::next (Ubegin);
89 const FLT ln = u - *Ubegin;
90 N += ln *
onebasisfun (u, p-1, Ubegin, std::prev (Uend)) / ld;
94 const FLT dn = *std::prev (Uend) - u;
95 N += dn *
onebasisfun (u, p-1, std::next (Ubegin), Uend) / dd;
124 const FLT Umin = *(std::min_element (Ubegin, Uend));
125 const FLT Umax = *(std::max_element (Ubegin, Uend));
127 if ((u >= Umin) && ( u <= Umax)) {
134 const FLT ld = *std::next (Uend, -2) - *Ubegin;
135 if (std::abs (ld) > FLT(0.0)) {
139 const FLT dd = *std::next (Uend, -1) - *std::next (Ubegin, 1);
140 if (std::abs (dd) > FLT(0.0)) {
163 const INT Nb = std::distance (bb, be);
164 const INT Nk = (p - r) * (Nb - 2) + 2 * (p + 1);
166 std::vector<FLT> k (Nk, *bb);
169 auto ki = std::next (k.begin (), p + 1);
170 for (
auto bi = std::next (bb); bi != be; bi = std::next (bi)) {
171 ki = std::fill_n (ki, p - r, *bi);
173 std::fill (ki, k.end (), *(std::next (be, -1)));