Sea una B-spline de grado $p$ se definirá por su ecuación paramétrica $$ \mathbf{r}(t) = \sum_{i=0}^n N_i^p(t)\mathbf{P}_i$$
donde el $n+1$ los puntos de control se indican con $\mathbf{P}_i$ . Las funciones de base $N_i^p$ se definen clásicamente como
$$ \begin{align} N_i^0(t) &= \begin{cases} 1 &\text{ if }t \in [t_i,t_{i+1}[ \\ 0 &\text{ otherwise } \end{cases} \end{align} $$ $$ \begin{align} N_i^p(t) = \frac{t - t_i}{t_{i + p} - t_i}N_i^{p-1} + \frac{t_{i + p + 1} - t}{t_{i + p + 1} - t_{i + 1}}N_{i+1}^{p-1} \end{align} $$ donde $\{t_i\}_{i = 0..m = n + p + 1}$ son los denominados nudos spline.
Tengo entendido que, debido al soporte compacto de esas funciones de base, sólo hay que evaluar la ecuación paramétrica sobre $[t_p,t_{m-p}]$ para obtener la spline completa.
Mi implementación actual de estas ecuaciones parece funcionar cuando la spline se deja abierta (ningún nudo tiene una multiplicidad igual a p + 1):
Para nudos uniformemente espaciados $t = [ 0, 1/6, 1/3, 1/2, 2/3, 5/6, 1 ]$ (m = 6) y una red de control compuesta por $n + 1 = 4$ puntos, lo que corresponde a una spline de grado $p =2$ Obtengo la siguiente curva (que, como he dicho, parece correcta)
Sin embargo, al forzar la sujeción de los extremos de la spline fijando
$ t= [ 0, 0, 0, 0.5, 1, 1, 1 ]$ sólo funciona en un extremo, como se muestra a continuación
Placa B-spline con abrazaderas. Sólo un extremo está bien sujeto
El extremo correspondiente a $t_p = 0$ se sujeta, pero el otro extremo correspondiente a $t_{m-p} = 1$ va a cero.
Creo que esta rareza es causada por la definición incorrecta del soporte de la línea B en el caso de sujeción. Encontré que al cambiar $ N_i^0(t) = 1 $ si $ t \in [t_i,t_{i+1}[ $ a $ N_i^0(t) = 1 $ si $ t \in [t_i,t_{i+1}] $ (es decir, utilizando un intervalo cerrado en su lugar) estaba permitiendo que la sujeción funcionara.
Dicho esto, no estoy seguro en absoluto de que sea necesario cambiar el soporte de las funciones de base para obtener una B-spline con abrazadera. ¿Me estoy perdiendo algo?