cubicSpline[pts_, endTangent_] :=
Module[{paras, knots, mat, len, n, aList, bList, cList, P1, Pn1, vec,
ctrlpts},
paras =
FoldList[Plus, 0, Normalize[(Norm /@ Differences[pts]), Total]] //
N;
len = Total[Norm /@ Differences[pts]] // N;
n = Length@pts - 1;
knots = ArrayPad[paras, 3, "Fixed"];
aList =
MapIndexed[BSplineBasis[{3, knots}, First@#2, #1] &,
paras[[2 ;; -2]]];
bList = MapIndexed[BSplineBasis[{3, knots}, First@#2 + 1, #1] &,
paras[[2 ;; -2]]];
cList = MapIndexed[BSplineBasis[{3, knots}, First@#2 + 2, #1] &,