Método para evaluar polinomios en forma de Bernstein
En el campo matemático del análisis numérico , el algoritmo de De Casteljau es un método recursivo para evaluar polinomios en forma de Bernstein o curvas de Bézier , llamadas así en honor a su inventor Paul de Casteljau . El algoritmo de De Casteljau también se puede utilizar para dividir una única curva de Bézier en dos curvas de Bézier con un valor de parámetro arbitrario.
El algoritmo es numéricamente estable [1] en comparación con la evaluación directa de polinomios. La complejidad computacional de este algoritmo es , donde d es el número de dimensiones y n es el número de puntos de control. Existen alternativas más rápidas. [2] [3]
Definición
Una curva de Bézier (de grado , con puntos de control ) se puede escribir en forma de Bernstein de la siguiente manera,
donde es un polinomio de base de Bernstein.
La curva en el punto se puede evaluar con la relación de recurrencia
Luego, la evaluación de un punto puede evaluarse en operaciones. El resultado viene dado por
Además, la curva de Bézier se puede dividir en dos curvas con respectivos puntos de control:
Interpretación geométrica
La interpretación geométrica del algoritmo de De Casteljau es sencilla.
Consideremos una curva de Bézier con puntos de control . Conectando los puntos consecutivos creamos el polígono de control de la curva.
Subdivide ahora cada segmento de recta de este polígono con la razón y conecta los puntos que obtengas. De esta manera llegarás al nuevo polígono con un segmento menos.
Repita el proceso hasta llegar al punto único: este es el punto de la curva correspondiente al parámetro .
La siguiente imagen muestra este proceso para una curva de Bézier cúbica:
Obsérvese que los puntos intermedios que se construyeron son, de hecho, los puntos de control para dos nuevas curvas de Bézier, ambas exactamente coincidentes con la antigua. Este algoritmo no solo evalúa la curva en , sino que la divide en dos partes en , y proporciona las ecuaciones de las dos subcurvas en forma de Bézier.
La interpretación dada anteriormente es válida para una curva de Bézier no racional. Para evaluar una curva de Bézier racional en , podemos proyectar el punto en ; por ejemplo, una curva en tres dimensiones puede tener sus puntos de control y pesos proyectados a los puntos de control ponderados . El algoritmo luego procede como de costumbre, interpolando en . Los puntos de cuatro dimensiones resultantes pueden proyectarse nuevamente en el espacio tridimensional con una división en perspectiva .
En general, las operaciones sobre una curva (o superficie) racional son equivalentes a las operaciones sobre una curva no racional en un espacio proyectivo . Esta representación como "puntos de control ponderados" y pesos suele ser conveniente al evaluar curvas racionales.
Notación
Al hacer el cálculo a mano, es útil escribir los coeficientes en un esquema triangular como
Al elegir un punto t 0 para evaluar un polinomio de Bernstein, podemos usar las dos diagonales del esquema triangular para construir una división del polinomio
en
y
Curva de Bézier
Al evaluar una curva de Bézier de grado n en un espacio tridimensional con n + 1 puntos de control
P i dividimos
la curva de Bézier en tres ecuaciones separadas
que evaluamos individualmente utilizando el algoritmo de De Casteljau.
Ejemplo
Queremos evaluar el polinomio de Bernstein de grado 2 con los coeficientes de Bernstein
en el punto t 0 .
Comenzamos la recursión con
y con la segunda iteración la recursión se detiene con
que es el polinomio de Bernstein esperado de grado 2 .
Implementaciones
A continuación se muestran ejemplos de implementaciones del algoritmo de De Casteljau en varios lenguajes de programación.
Haskell
deCasteljau :: Doble -> [( Doble , Doble )] -> ( Doble , Doble )deCasteljau t [ b ] = bcoeficientes t de deCasteljau = t de deCasteljau reducidadóndereducido = zipWith ( lerpP t ) coefs ( coefs de cola )lerpP t ( x0 , y0 ) ( x1 , y1 ) = ( lerp t x0 x1 , lerp t y0 y1 )lerp t a b = t * b + ( 1 - t ) * a
Pitón
def de_casteljau ( t : float , coefs : lista [ float ]) -> float :"""Algoritmo de De Casteljau."""beta = coefs . copy () # los valores en esta lista se anulann = len ( beta )para j en el rango ( 1 , n ):para k en el rango ( n - j ):beta [ k ] = beta [ k ] * ( 1 - t ) + beta [ k + 1 ] * tdevuelve beta [ 0 ]
Java
público doble deCasteljau ( doble t , doble [] coeficientes ) {doble [] beta = coeficientes ;int n = beta . longitud ;para ( int i = 1 ; i < n ; i ++ ) {para ( int j = 0 ; j < ( n - i ); j ++ ) {beta [ j ] = beta [ j ] * ( 1 - t ) + beta [ j + 1 ] * t ;}}devuelve beta [ 0 ] ;}
Ejemplo de código en JavaScript
La siguiente función de JavaScript aplica el algoritmo de De Casteljau a una matriz de puntos de control o polos como los nombró originalmente De Casteljau para reducirlos uno por uno hasta llegar a un punto en la curva para un t dado entre 0 para el primer punto de la curva y 1 para el último.
función crlPtReduceDeCasteljau ( puntos , t ) {deje que retArr = [ puntos . slice () ];mientras ( puntos . longitud > 1 ) {deje que los puntos medios sean [];para ( sea i = 0 ; i + 1 < puntos . longitud ; ++ i ) {sea ax = puntos [ i ][ 0 ];sea ay = puntos [ i ][ 1 ];sea bx = puntos [ i + 1 ][ 0 ];sea por = puntos [ i + 1 ][ 1 ];// a * (1-t) + b * t = a + (b - a) * tpuntos medios . empujar ([ax + ( bx - ax ) * t ,ay + ( por - ay ) * t ,]);}retArr . push ( puntos medios )puntos = puntos medios ;}devolver retArr ;}
Por ejemplo,
var polos = [ [0, 128], [128, 0], [256, 0], [384, 128] ] crlPtReduceDeCasteljau (polos, .5)
^ Delgado, J.; Mainar, E.; Peña, JM (1 de octubre de 2023). "Sobre la precisión de los algoritmos de tipo de Casteljau y las representaciones de Bernstein". Computer Aided Geometric Design . 106 : 102243. doi :10.1016/j.cagd.2023.102243. ISSN 0167-8396.
^ Woźny, Paweł; Chudy, Filip (1 de enero de 2020). "Algoritmo geométrico de tiempo lineal para evaluar curvas de Bézier". Diseño asistido por ordenador . 118 : 102760. arXiv : 1803.06843 . doi :10.1016/j.cad.2019.102760. ISSN 0010-4485.
^ Fuda, Chiara; Ramanantoanina, Andriamahenina; Hormann, Kai (2024). "Una comparación exhaustiva de algoritmos para evaluar curvas de Bézier racionales". Notas de investigación sobre aproximación en dolomitas . 17 (9/2024): 56–78. doi :10.14658/PUPJ-DRNA-2024-3-9. ISSN 2035-6803.
Aproximación lineal por partes de las curvas de Bézier: descripción del algoritmo de De Casteljau, incluido un criterio para determinar cuándo detener la recursión
Curvas de Bézier y Picasso — Descripción e ilustración del algoritmo de De Casteljau aplicado a curvas de Bézier cúbicas.
Algoritmo de Casteljau - Ayuda para la implementación y demostración interactiva del algoritmo.