A similar approach I take involves letting ParametricPlot[]
do its adaptive sampling capabilities, instead of having to guess the stepsize needed for sampling the BSplineFunction[]
. Then, it's a simple matter of extracting the points generated using Cases[]
:
poly = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
weights = {7.8, 9.1, 4.8, 7.8};
fp = Cases[Normal @ ParametricPlot[BSplineFunction[poly, SplineClosed -> True,
SplineDegree -> 3,
SplineWeights -> weights][t] //
Evaluate, {t, 0, 1}],
Line[l_] :> Polygon[l], Infinity];
Graphics[{{ColorData[97, 2], fp},
{Directive[AbsoluteThickness[3], ColorData[97, 1]],
BSplineCurve[poly, SplineClosed -> True, SplineDegree -> 3,
SplineWeights -> weights]}}]