7 votos

algoritmo para calcular los puntos de control de una curva cúbica de Bézier

Tengo todos los puntos por donde pasa mi curva, pero necesito obtener las coordenadas de los puntos de control para poder dibujar la curva. ¿Cómo puedo hacer para calcular estos puntos?

5voto

Andrew Puntos 140

Cuando lo que tienes es un conjunto de puntos por los que debe pasar tu curva, Bézier no es lo que quieres; deberías usar una spline paramétrica (cúbica).

Suponiendo que sus puntos $\mathbf{P}_i=(x_i,y_i)$ , $i=1\dots n$ representan una curva general (a diferencia de una función $f(x)$ para el que basta con aplicar el algoritmo habitual de splines cúbicos sobre sus puntos), Eugene Lee propuso parametrización centrípeta para generar los valores de los parámetros adecuados $t_i$ asociado a su $\mathbf{P}_i$ . La receta para generar el $t_i$ (en su forma más general) es

centripetal

donde $\left\| \cdot \right\|$ es la longitud (euclidiana), $e$ es un exponente ajustable en el intervalo $[0,1]$ y $t_1=0$ . (Un valor habitual para $e$ es 0,5, pero $e=1$ también se utiliza a veces).

A partir de esto, se aplica el algoritmo habitual de splines cúbicos a los conjuntos $(t_i,x_i)$ y $(t_i,y_i)$ , a partir de la cual tienes ahora tu spline paramétrico. (Se recomienda el spline periódico para curvas cerradas, y el spline "sin nudo" para todos los demás casos).

La caja de herramientas de splines de MATLAB tiene soporte para este esquema de parametrización, aunque no debería ser muy difícil escribir su propia implementación.

1voto

bubba Puntos 16773

Depende de cuántos puntos tengas.

Si sólo tienes 4 puntos, entonces sólo necesitarás un segmento cúbico de Bézier. Supongamos que tus puntos conocidos (por los que quieres que pase la curva) son $Q_0, Q_1, Q_2, Q_3$ . Primero hay que elegir 4 valores de parámetros $t_0,t_1,t_2,t_3$ para asignar a estos puntos. El enfoque centrípeto descrito en la otra respuesta es bueno. En situaciones sencillas, en las que los puntos son bastante equidistantes, una opción mucho más simple es simplemente $(t_0,t_1,t_2,t_3) = (0, 1/3, 2/3, 1)$ . Entonces hay que resolver un sistema de 4 ecuaciones lineales, como se indica a continuación. Supongamos que $P_0,P_1, P_2, P_3$ son los puntos de control (desconocidos) de la curva de Bézier, y denotamos la curva por $C(t)$ . Entonces queremos $C(t_i) = Q_i$ para $i=0,1,2,3$ . Esto significa que $$ \sum_{j=0}^3{b_j(t_i)P_j} = Q_i$$ para $i=0,1,2,3$ , donde $b_0, b_1,b_2,b_3$ son los polinomios de Bernstein de grado 3. Resuelva estas ecuaciones para obtener $P_0,P_1, P_2, P_3$ . Si siempre utiliza $(t_0,t_1,t_2,t_3) = (0, 1/3, 2/3, 1)$ entonces la matriz de coeficientes del sistema lineal es fija, y sólo hay que invertirla una vez (exactamente), y guardar la respuesta. Esto te da una fórmula sencilla que relaciona el $P$ y $Q$ 's.

Si tiene más de 4 puntos, puede utilizar una curva de Bézier de grado superior a 4. Los cálculos son análogos a los mostrados anteriormente. Pero un mejor enfoque es utilizar una "spline" que consiste en varios segmentos cúbicos de Bezier unidos de extremo a extremo. Hay muchas formas de calcular splines. Una de las más sencillas (y la más popular entre los gráficos) es la spline de Catmull-Rom. Esta fórmula permite calcular los puntos de control en función de los puntos dados. $Q_i$ .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X