# Spline centrípeto de Catmull-Rom

En computación gráfica, el spline centrípeto de Catmull-Rom es una variante del interpolador cúbico de Hermite, formulada originalmente por Edwin Catmull y Raphael Rom, que puede calcularse utilizando un algoritmo recursivo propuesto por Barry y Goldman. Es un tipo de spline de interpolación definido por cuatro puntos de control $\mathbf {P} _{0},\mathbf {P} _{1},\mathbf {P} _{2},\mathbf {P} _{3}$ (por los que pasa), pero con la curva dibujada solo de $\mathbf {P} _{1}$ a $\mathbf {P} _{2}$.

## Definición

Sea $\mathbf {P} _{i}=[x_{i}\quad y_{i}]^{T}$ un punto. Para un segmento de curva $\mathbf {C}$ definido por los puntos $\mathbf {P} _{0},\mathbf {P} _{1},\mathbf {P} _{2},\mathbf {P} _{3}$ y la secuencia de nodos $t_{0},t_{1},t_{2},t_{3}$, el spline centrípeto de Catmull-Rom se puede generar mediante:
    $\mathbf {C} ={\frac {t_{2}-t}{t_{2}-t_{1}}}\mathbf {B} _{1}+{\frac {t-t_{1}}{t_{2}-t_{1}}}\mathbf {B} _{2}$
donde
    $\mathbf {B} _{1}={\frac {t_{2}-t}{t_{2}-t_{0}}}\mathbf {A} _{1}+{\frac {t-t_{0}}{t_{2}-t_{0}}}\mathbf {A} _{2}$
    $\mathbf {B} _{2}={\frac {t_{3}-t}{t_{3}-t_{1}}}\mathbf {A} _{2}+{\frac {t-t_{1}}{t_{3}-t_{1}}}\mathbf {A} _{3}$
    $\mathbf {A} _{1}={\frac {t_{1}-t}{t_{1}-t_{0}}}\mathbf {P} _{0}+{\frac {t-t_{0}}{t_{1}-t_{0}}}\mathbf {P} _{1}$
    $\mathbf {A} _{2}={\frac {t_{2}-t}{t_{2}-t_{1}}}\mathbf {P} _{1}+{\frac {t-t_{1}}{t_{2}-t_{1}}}\mathbf {P} _{2}$
    $\mathbf {A} _{3}={\frac {t_{3}-t}{t_{3}-t_{2}}}\mathbf {P} _{2}+{\frac {t-t_{2}}{t_{3}-t_{2}}}\mathbf {P} _{3}$
y
    $t_{i+1}=\left[{\sqrt {(x_{i+1}-x_{i})^{2}+(y_{i+1}-y_{i})^{2}}}\right]^{\alpha }+t_{i}$
en el que $\alpha$ va de 0 a 1 para la parametrización de los nodos, y $i=0,1,2,3$ con $t_{0}=0$. Para el spline centrípeto de Catmull-Rom, el valor de $\alpha$ es $0.5$. Cuando $\alpha =0$, la curva resultante es el spline uniforme de Catmull-Rom estándar; y cuando $\alpha =1$, el resultado es el spline cordal de Catmull-Rom.
Al conectar $t=t_{1}$ a las ecuaciones del spline $\mathbf {A} _{1},\mathbf {A} _{2},\mathbf {A} _{3},\mathbf {B} _{1},\mathbf {B} _{2},$ y $\mathbf {C}$ se muestra que el valor de la curva en $t_{1}$ es $\mathbf {C} =\mathbf {P} _{1}$. De manera similar, sustituir $t=t_{2}$ en las ecuaciones spline muestra que $\mathbf {C} =\mathbf {P} _{2}$ en $t_{2}$. Esto es cierto independientemente del valor de $\alpha$, ya que la ecuación de $t_{i+1}$ no es necesaria para calcular el valor de $\mathbf {C}$ en los puntos $t_{1}$ y $t_{2}$.
La extensión a puntos 3D se logra simplemente considerando $\mathbf {P} _{i}=[x_{i}\quad y_{i}\quad z_{i}]^{T}$ respecto a un punto 3D genérico $\mathbf {P} _{i}$ y
    $t_{i+1}=\left[{\sqrt {(x_{i+1}-x_{i})^{2}+(y_{i+1}-y_{i})^{2}+(z_{i+1}-z_{i})^{2}}}\right]^{\alpha }+t_{i}$

## Ventajas

El spline centrípeto de Catmull-Rom tiene varias propiedades matemáticas deseables en comparación con la formulación original y otros tipos de splines de Catmull-Rom. En primer lugar, no formará un bucle ni una autointersección dentro de un segmento de curva. En segundo lugar, nunca genera cúspides dentro de un segmento de curva. En tercer lugar, sigue más estrictamente los puntos de control.

## Otros usos

En visión artificial, se ha utilizado el spline centrípeto de Catmull-Rom para formular un modelo activo para la segmentación. El método se denomina modelo de spline activo. El modelo está diseñado sobre la base del modelo de forma activo, pero utiliza un spline centrípeto de Catmull-Rom para unir dos puntos sucesivos (el modelo de forma activa utiliza una línea recta simple), de modo que el número total de puntos necesarios para representar una forma es menor. El uso del spline centrípeto de Catmull-Rom simplifica mucho el entrenamiento de un modelo de forma y permite una mejor manera de editar un contorno después de la segmentación.

## Ejemplo de código en Python

La siguiente es una implementación del spline de Catmull-Rom en Python, que produce el gráfico que se muestra a continuación.