How to speed up the plotting of B-spline curve?
The plot is sped up substantially if you use Evaluate
:
ParametricPlot[
Evaluate[ Total@MapIndexed[NBSpline[First@#2 - 1, p, knots, u] #1 &, pts]] ,
{u, a, b}, opts]
(I only looked a trial 1 , but I think your other try have the same issue )
It helps a little more if you remove the Simplify
from NBSpline
and simplify the whole thing:
ParametricPlot[
Evaluate[Total@
MapIndexed[NBSpline[First@#2 - 1, p, knots, u] #1 &, pts] //
Simplify], {u, a, b}, opts]
Your original form is a sum of piecewise expressions. The outer Simplify
condenses the whole thing into a single piecewise.
The gaps seem to relate the nature of the discontinuity in derivatives of the bspline w/ respect to its parameter at the knots, which evidently fools Parametric Plot
into thinking there is an actual discontinuity.
The gaps close with PlotPoints -> 1000
, though if you look at the graphics produced you'll see you still have separate Line
s for each portion. I don't think there is anything to do about that except not use ParametricPlot
.
You might try doing away with ParametricPlot
and doing Graphics@Line@Table ..
,
which may speed it up as well.
Re: your error
BSplinePlot2[pts : {{_, _} ..}, knots_, opts : OptionsPattern[{Plot, BSplinePlot}]] :=
Module[{p = Length@First@Split[knots] - 1, a, b},
{a, b} = {First[knots], Last[knots]};
With[{a1 = a, b1 = b},
ParametricPlot[
Total@MapIndexed[NBSpline[First@#2 - 1, p, knots, u] #1 &, pts], {u, a1, b1},
Evaluate[Sequence @@ FilterRules[{opts}, Options[Plot]]],
Epilog -> If[OptionValue[ShowPoints],
Join[Text @@@ (Thread@{Table[ Style[Subscript["P", i], 14], {i, 0, Length@pts - 1}],
# + {.4, .2} & /@ pts}), {Red,PointSize[0.015],Point[pts], Green, Line[pts]}]]]]]
pts = {{0, 0}, {0, 2}, {2, 3}, {4, 0}, {6, 3}, {8, 2}, {8, 0}};
knots = {0, 0, 0, 1/5, 2/5, 3/5, 4/5, 1, 1, 1};
BSplinePlot2[pts, knots, PlotRange -> {{0, 10}, {0, 5}}, ShowPoints -> True]