Comment construire une fonction spline récursive en C ++

10

En ce moment, je travaille sur une méthode de résolution d'équations différentielles appelée collocation base-spline. Ce avec quoi j'ai du mal à construire une méthode pour construire une spline d'ordre arbitraire, avec la relation avec la condition initiale B 1 i (x)={ 1

Bjek+1(X)=X-XjeXk+je-XjeBjek+Xk+je+1-XXk+je+1-Xje+1Bje+1k(X)
et j'ai du mal même à démarrer avec ce problème, car il est récursif sur pourrait commencer à partir du "haut" ou du "bas", et je rencontre un type de bloc de script général, où je ne peux pas obtenir mon esprit autour de ce que je dois faire.
Bje1(X)={1pour XjeX<Xje+10autrement
Kane
la source

Réponses:

7

Je peux recommander de consulter Le livre NURBS , qui semble être un texte classique sur ce sujet. L'algorithme lui-même est donné à la page 72 , il est disponible pour une visualisation en ligne.

faleichik
la source
6

p+1

Nathan Collier
la source
4

Honnêtement, je ne sais pas à quel point c'est efficace, mais une façon de le faire est avec les modèles c ++:

L'ordre est k, t est la structure du nœud et x est la valeur souhaitée.

template <int k> 
real BSpline(real x, real *t)
{
    if (*t <= x && x < *(t+k))
    {
        real a = (x - *t) / (*(t+k-1) - *t);
        real b = (*(t+k) - x) / (*(t+k) - *(t+1));

        return a * BSpline<k-1>(x, t) + b * BSpline<k-1>(x, (t+1));
    }
    else
        return 0;
};

template <>
real BSpline<1>(real x, real *t)
{
    if (*t <= x && x < *(t+1))
        return 1.;
    else
        return 0.;
};
Andrew Spott
la source