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]]
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]
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]]
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]]
Plot[if[x] - cp.BernsteinBasis[3, Range[0, 3], Rescale[x, MinMax[xt]]],
x, 0, 6, Evaluated -> True, PlotRange -> All]
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)