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

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.



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.;
};
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.