Saltar al contenido

¿Cómo calcular los puntos de control de una curva de Bézier?

Esta crónica ha sido analizado por expertos así se asegura la exactitud de nuestra esta crónica.

Solución:

Aquí está mi enfoque:

pts = 0, 0, 2, 1, 4, 3, 6, 1;
paras = FoldList[Plus, 0, Normalize[(Norm /@ Differences[pts]), Total]] // N
mat = Outer[BernsteinBasis[3, #1, #2] &, Range[0, 3], paras] // Transpose;
ctrlpts = LinearSolve[mat, pts]
(* 0., 0., 2.71043, -0.262717, 3.94236, 6.32778, 6., 1. *)

Graphics[BezierCurve[ctrlpts], PointSize[Medium], Red, Point[pts]]

Bezier

Comparar con Interpolation[]

Mostrar que los resultados de la interpolación de la curva de Bézier y la incorporadoInterpolation[] son muy diferentes, usaré los siguientes datos:

pts1 = -1, 0, 2, 1, 4, 4, 6, -3;
mat1 = Outer[BernsteinBasis[3, #1, #2] &, Range[0, 3], 
             FoldList[Plus, 0.0, 
                      Normalize[(Norm /@ Differences[pts1]), Total]]] // Transpose;

f = Interpolation[pts1];
Show[Plot[f[x], x, -1, 6], 
     Graphics[BezierCurve[LinearSolve[mat1, pts1]], 
               PointSize[Medium], Red, Point[pts1]], 
     PlotRange -> Automatic, -3, 6]

comparación

No es necesario recurrir a la parametrización de la longitud de la cuerda como se hizo en la otra respuesta para este problema de interpolación simple.

pts = 0, 0, 2, 1, 4, 3, 6, 1;
xt, yt = Transpose[pts];
cp = LinearSolve[Outer[BernsteinBasis[3, #2, #1] &, Rescale[xt], Range[0, 3]], yt]
   0, -7/6, 20/3, 1

Graphics[Directive[AbsoluteThickness[2], ColorData[97, 1]], 
           BezierCurve[Transpose[xt, cp]],
          Directive[AbsolutePointSize[6], ColorData[97, 2]], Point[pts]]

interpolación de la curva de Bézier

Se deja como ejercicio para el lector interesado una explicación de los dos resultados siguientes:

if = Interpolation[pts];
Plot[if[x], x, 0, 6, 
     Epilog -> Directive[AbsoluteThickness[2], ColorData[97, 2]],
                BezierCurve[Transpose[xt, cp]], 
     PlotStyle -> AbsoluteThickness[6]]

Curva de Bezier frente a función de interpolación

Plot[if[x] - cp.BernsteinBasis[3, Range[0, 3], Rescale[x, MinMax[xt]]],
     x, 0, 6, Evaluated -> True, PlotRange -> All]

diferencia

Recuerda que puedes optar por la opción de valorar este artículo si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *