% NURBS Toolbox.
% Version 1.0
% demos - NURBS demonstrations
% nrbmak - Construct a NURBS from control points and knots.
% nrbtform - Applying scaling, translation or rotation operators.
% nrbkntins - Knot insertion/refinement.
% nrbdegelev - Degree elevation.
% nrbderiv - NURBS representation of the derivative.
% nrbdeval - Evaluation of the NURBS derivative.
% nrbkntmult - Find the multiplilicity of a knot vector.
% nrbreverse - Reverse evaluation direction of the NURBS.
% nrbtransp - Swap U and V for NURBS surface.
% nrbline - Construct a straight line.
% nrbcirc - Construct a circular arc.
% nrbrect - Construct a rectangle.
% nrb4surf - Surface defined by 4 corner points.
% nrbeval - Evalution of NURBS curve or surface.
% nrbextrude - Extrude a NURBS curve along a vector.
% nrbrevolve - Construct surface by revolving a profile.
% nrbruled - Ruled surface between twp NURBS curves.
% nrbcoons - Construct Coons bilinearly blended surface patch.
% nrbplot - Plot NURBS curve or surface.
% bspeval - Evaluate a univariate B-Spline.
% bspderiv - B-Spline representation of the derivative
% bspkntins - Insert a knot or knots into a univariate B-Spline.
% bspdegelev - Degree elevation of a univariate B-Spline.
% vecnorm - Normalise the vectors.
% vecmag - Magnitaude of the vectors.
% vecmag2 - Squared Magnitude of the vectors.
% vecangle - Alternative to atan2 (0 <= angle <= 2*pi)
% vecdot - Dot product of two vectors.
% veccross - Cross product of two vectors.
% vecrotx - Rotation matrix around the x-axis.
% vecroty - Rotation matrix around the y-axis.
% vecrotz - Rotation matrix around the z-axis.
% vecscale - Scaling matrix.
% vectrans - Translation matrix.
% deg2rad - Convert degrees to radians.
% rad2deg - Convert radians to degrees.
% Initialize Basis Matrix A
span = findspan(size(Q,1),deg,ub(i),KV);
N = basisfun(span,ub(i),deg,KV);
l = span-deg;
A(i,l+k) = N(k);
% Set first and last Matrix Value
A(1,1) = 1.0;
A(size(Q,1),size(Q,1)) = 1.0;
tmp = A\Q;
% Save Control Points
CP = [tmp(:,1) tmp(:,2) tmp(:,3)]';
function [ KV ] = setKVcentripetal( n,p,u )
%SETKVCENTRIPETAL Generates a Knot Vektor matching parametrization u
KV = zeros(n+p,1);
KV(i) = 1.0;
tmp = 0.0;
tmp = tmp+u(i);
KV(j+p) = tmp/p;
function [ uc ] = paramCentripetal( points )
%PARAMCENTRIPETAL Centripetal parametrization for given points
uc = zeros(size(points,1),1);
uc(1) = 0.0;
d = 0.0;
d = d + pdist([points(i,:);points(i-1,:)]);
uc(i) = uc(i-1) + pdist([points(i,:);points(i-1,:)])/d;
uc(size(uc,1)) = 1.0;
Hi Paul, this is great, thanks a lot! I am using it for several projects. However, for one application I would like to have the condition, that the 3D surface is tangential to every curve (contour). Is there such an option or where do I need to hook? Best regards!
There is a bug in nrbcoons.m, at line 82. all 'u's should be replaced with 'v's - the ruled surfaces and bilinear surfaces generated are equivalent but not in directly-addable representations in the current code.
This toolbox is very useful. It can improve many problems in my applications. However, it seems some small bugs when I evaluate the derivative of nurbs curves/surfaces.
In the file "nrbderiv ":
this file call the function "bspderiv". If the weights of the original nurbs curve/surface are equal ( example: the weight = 1 at each vertex ), this weights of nurbs curve/surface vanish after call bspderiv in file nrbderiv.
Maybe, we should revise the file "nrbderiv" before calling the function "bspderiv" to preserve the original weights.
I have a set of points say 300 something following the outline of cerebral aneurysm. I want to smooth this curve using the NURBS tool box provided here. How do i use this ? Where do I give my input? I just need a Bspline fitting to the data I have i.e. effectively to smooth the outline of the trace I have. Help me out..