% [cpts,knots] = bsplineinsert(degree,cpts,knots,t) % % Given a spline with given degree, control points and knots, insert a new % knot at t and return new control points and knots. % % Matthew Chapman , based on algorithm in % https://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/NURBS-knot-insert.html function [cpts,knots] = bsplineinsert(degree,cpts,knots,t) % find knot span that contains t for k = 1:length(knots)-1 if t >= knots(k) && t < knots(k+1) break end end % calculate new control points newcpts = []; for j = k-degree+1:k alpha = (t-knots(j))/(knots(j+degree)-knots(j)); newcpts = [newcpts; (1-alpha)*cpts(j-1)+alpha*cpts(j)]; end cpts = [cpts(1:k-degree); newcpts; cpts(k:end)]; knots = [knots(1:k) t knots(k+1:end)]; end