Logo Search packages:      
Sourcecode: octave-nurbs version File versions  Download package

nrbderiv.m

function dnurbs = nrbderiv(nurbs)
% 
% NRBDERIV: Construct the first derivative representation of a
%           NURBS curve or surface.
% 
% Calling Sequence:
% 
%   ders = nrbderiv(nrb);
% 
% Parameters:
% 
%   nrb           : NURBS data structure, see nrbmak.
% 
%   ders    : A data structure that represents the first
%             derivatives of a NURBS curve or surface.
% 
% Description:
% 
%   The derivatives of a B-Spline are themselves a B-Spline of lower degree,
%   giving an efficient means of evaluating multiple derivatives. However,
%   although the same approach can be applied to NURBS, the situation for
%   NURBS is a more complex. I have at present restricted the derivatives
%   to just the first. I don't claim that this implentation is
%   the best approach, but it will have to do for now. The function returns
%   a data struture that for a NURBS curve contains the first derivatives of
%   the B-Spline representation. Remember that a NURBS curve is represent by
%   a univariate B-Spline using the homogeneous coordinates.
%   The derivative data structure can be evaluated later with the function
%   nrbdeval.
% 
% Examples:
% 
%   See the function nrbdeval for an example.
% 
% See:
% 
%       nrbdeval

%  D.M. Spink
%  Copyright (c) 2000.

if ~isstruct(nurbs)
  error('NURBS representation is not structure!');
end

if ~strcmp(nurbs.form,'B-NURBS')
  error('Not a recognised NURBS representation');
end

degree = nurbs.order - 1;

if iscell(nurbs.knots)
  % NURBS structure represents a surface

  num1 = nurbs.number(1);
  num2 = nurbs.number(2);

  % taking derivatives along the u direction
  dknots = nurbs.knots;
  dcoefs = permute(nurbs.coefs,[1 3 2]);
  dcoefs = reshape(dcoefs,4*num2,num1);
  [dcoefs,dknots{1}] = bspderiv(degree(1),dcoefs,nurbs.knots{1});
  dcoefs = permute(reshape(dcoefs,[4 num2 size(dcoefs,2)]),[1 3 2]);
  dnurbs{1} = nrbmak(dcoefs, dknots);

  % taking derivatives along the v direction
  dknots = nurbs.knots;
  dcoefs = reshape(nurbs.coefs,4*num1,num2);
  [dcoefs,dknots{2}] = bspderiv(degree(2),dcoefs,nurbs.knots{2});
  dcoefs = reshape(dcoefs,[4 num1 size(dcoefs,2)]);
  dnurbs{2} = nrbmak(dcoefs, dknots);

else
  % NURBS structure represents a curve

  [dcoefs,dknots] = bspderiv(degree,nurbs.coefs,nurbs.knots);
  dnurbs = nrbmak(dcoefs, dknots);

end




 

Generated by  Doxygen 1.6.0   Back to index