stringtranslate.com

Algoritmo de De Casteljau

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 , llamado 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.

Aunque el algoritmo es más lento para la mayoría de las arquitecturas en comparación con el enfoque directo, es más estable numéricamente . [ cita necesaria ]

Definición

Una curva de Bézier (de grado , con puntos de control ) se puede escribir en forma de Bernstein de la siguiente manera

¿Dónde está el polinomio de base de Bernstein ?

La curva en el punto se puede evaluar con la relación de recurrencia.

Entonces, la evaluación de un punto se puede evaluar en operaciones. El resultado está dado por

Además, la curva de Bézier se puede dividir en dos curvas con sus respectivos puntos de control:

Interpretación geométrica

La interpretación geométrica del algoritmo de De Casteljau es sencilla.

La siguiente imagen muestra este proceso para una curva de Bézier cúbica:

Tenga en cuenta que los puntos intermedios que se construyeron son, de hecho, los puntos de control de 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 . Luego, el algoritmo procede como de costumbre, interpolando en . Los puntos cuatridimensionales resultantes se pueden proyectar nuevamente en un espacio tridimensional con una división de 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 del triángulo para construir una división del polinomio.

en

y

curva de Bézier

Una 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

con

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 recursividad con

y con la segunda iteración la recursividad 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 ] = b deCasteljau t coefs = deCasteljau t reducido donde reducido = zipWith ( lerpP t ) coefs ( tail coefs ) 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 ,  coefs ):  beta  =  [ c  for  c  in  coefs ]  # los valores en esta lista se anulan  n  =  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 ]  *  t  devuelve  beta [ 0 ]

Java

público doble deCasteljau ( doble t , doble [] coeficientes ) { doble [] beta = coeficientes ; int norte = beta . longitud ; para ( int i = 0 ; i < n ; i ++ ) { para ( int j = 0 ; j < ( n - i ); j ++ ) { beta [ j ] = beta [ j ] * ( 1 - t ) + beta [ j + 1 ] * t ; } } devolver beta [ 0 ] ; }                                                     

javascript

La siguiente función aplica el algoritmo de De Casteljau a una matriz de points, resolviendo el punto medio final con las propiedades adicionales iny out(para las tangentes "de entrada" y "de salida" del punto medio, respectivamente).

función deCasteljau ( puntos , posición = 0,5 ) {     sea ​​a , b , puntos medios = [];     mientras ( puntos . longitud > 1 ) {    número constante = puntos . longitud - 1 ;     para ( sea i = 0 ; i < núm ; ++ i ) {         a = puntos [ i ];  b = puntos [ i + 1 ];  puntos medios . empujar ([a [ 0 ] + (( b [ 0 ] - a [ 0 ]) * posición ),      a [ 1 ] + (( b [ 1 ] - a [ 1 ]) * posición ),      ]);}puntos = puntos medios ;  puntos medios = [];  }devolver objeto . asignar ( puntos [ 0 ], { entrada : a , salida : b });     }

El siguiente ejemplo llama a esta función con los puntos verdes debajo, exactamente a la mitad de la curva. Las coordenadas resultantes deben ser iguales a , o la posición del punto rojo más central .

Segmentos de recta intermedios obtenidos aplicando recursivamente interpolación lineal a puntos adyacentes.
Segmentos de recta intermedios obtenidos aplicando recursivamente interpolación lineal a puntos adyacentes.
{ /* Definición de la función deCasteljau() omitida por brevedad */ const nodes = window . documento . querySelectorAll ( "circulo.n0-punto" ); puntos constantes = Matriz . de ( nodos ). map (({ cx , cy }) => [ cx . baseVal . valor , cy . baseVal . valor ]); deCasteljau ( puntos ); // Resultado: [192, 32] }           

Ver también

Referencias

enlaces externos