Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (*Search the index of span [ui,ui+1)*)
- searchSpan[knots_, u0_] :=
- If[u0 != Max@knots,
- Ordering[UnitStep[u0 - knots], 1][[1]] - 2,
- Position[knots, u0][[1, 1]] - 2
- ]
- (*The definition of α coefficient*)
- α[{deg_, knots_}, {j_, k_}, u0_] /;
- knots[[j + deg + 2]] == knots[[j + k + 1]] := 0
- α[{deg_, knots_}, {j_, k_}, u0_] :=
- (u0 - knots[[j + k + 1]])/(knots[[j + deg + 2]] - knots[[j + k + 1]])
- (*Implementation of de Boor algorithm*)
- deBoor[pts : {{_, _} ..}, {deg_, knots_}, u0_] :=
- Module[{calcNextGroup, idx = searchSpan[knots, u0]},
- calcNextGroup =
- Function[{points, k},
- Module[{coords, coeffs},
- coords = Partition[points, 2, 1];
- coeffs = {1 - #, #} & /@ (α[{deg, knots}, {#, k + 1}, u0] & /@
- Range[idx - deg, idx - k - 1]);
- {Plus @@@ MapThread[Times, {coords, coeffs}], k + 1}]
- ];
- Nest[calcNextGroup[Sequence @@ #] &,
- {pts[[idx - deg + 1 ;; idx + 1]], 0}, deg][[1, 1]]
- ]
- points =
- {{1, 4}, {.5, 6}, {5, 4}, {3, 12}, {11, 14}, {8, 4}, {12, 3}, {11, 9}, {15, 10}, {17, 8}};
- (*here, I set the knots uniformly*)
- knots = {0, 0, 0, 0, 1/7, 2/7, 3/7, 4/7, 5/7, 6/7, 1, 1, 1, 1};
- ParametricPlot[
- deBoor[points, {3, knots}, t], {t, 0, 1}, Axes -> False]
- pointsCLOSE =
- {{1, 4}, {.5, 6}, {5, 4}, {3, 12}, {11, 14}, {8, 4}, {12, 3},
- {11, 9}, {15, 10}, {17, 8}, {1, 4}};
- (*here, I set the knots uniformly*)
- knotsCLOSE = {0, 0, 0, 0, 1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8, 1, 1, 1, 1};
- ParametricPlot[
- deBoor[pointsCLOSE, {3, knotsCLOSE}, t], {t, 0, 1}, Axes -> False]
- Graphics[{BSplineCurve[points, SplineClosed -> True]}]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement