Здесь вы можете увидеть алгоритм, реализованный в Mathematica, следуя номенклатуре в вашей ссылке , и вашим двум графикам:
(*Function Definitions*)
lerp[a_, b_, t_] := (1 - t) a + t b;
pts1[t_] := {
lerp[pts[[1]], pts[[2]], t],
lerp[pts[[2]], pts[[3]], t],
lerp[pts[[3]], pts[[4]], t]};
pts2[t_] := {
lerp[pts1[t][[1]], pts1[t][[2]], t],
lerp[pts1[t][[2]], pts1[t][[3]], t]};
pts3[t_] := {
lerp[pts2[t][[1]], pts2[t][[2]], t]};
(*Usages*)
pts = {{0, 0}, {2, 0}, {2, 2}, {4, 2}};
Framed@Show[ParametricPlot[pts3[t], {t, 0, 1}, Axes -> True],
Graphics[{Red, PointSize[Large], Point@pts}]]
pts = {{0, 0}, {2, 0}, {0, 2}, {4, 2}};
Framed@Show[ParametricPlot[pts3[t], {t, 0, 1}, Axes -> True],
Graphics[{Red, PointSize[Large], Point@pts}]]
BTW,кривые определяются следующими параметрическими уравнениями, которые являются функциями pts3[t]
в приведенном выше коде:
c1[t_] := {2 t (3 + t (-3 + 2 t)), (* <- X component *)
2 (3 - 2 t) t^2} (* <- Y component *)
и
c2[t_] := {2 t (3 + t (-6 + 5 t)), (* <- X component *)
, 2 (3 - 2 t) t^2} (* <- Y component *)
Попробуйте построить их!
Взяв любое из этих кривых уравнений и решив кубический многочлен, вы можете в этих случаях получить выражение для y [x], что, конечно, не всегда возможно.Просто для того, чтобы вы почувствовали его вкус, начиная с первой кривой (синтаксис C):
y[x]= 3 - x - 3/Power(-2 + x + Sqrt(5 + (-4 + x)*x),1/3) +
3*Power(-2 + x + Sqrt(5 + (-4 + x)*x),1/3)
Try plotting it!
Редактировать
Просто забавы:
Mathematica - довольно мощный функциональный язык, и фактически весь алгоритм может быть выражен в виде одной строки:
f = Nest[(1 - t) #[[1]] + t #[[2]] & /@ Partition[#, 2, 1] &, #, Length@# - 1] &
Такая
f@{{0, 0}, {2, 0}, {0, 2}, {4, 2}}
дает приведенные выше результаты, но поддерживает любое количество баллов.
Давайте попробуем с шестью случайными точками:
p = RandomReal[1, {6, 2}];
Framed@Show[
Graphics[{Red, PointSize[Large], Point@p}],
ParametricPlot[f@p, {t, 0, 1}, Axes -> True]]
Более того, эта же функция работает в 3D:
p = RandomReal[1, {4, 3}];
Framed@Show[
Graphics3D[{Red, PointSize[Large], Point@p}],
ParametricPlot3D[f[p], {t, 0, 1}, Axes -> True]]