]> Creatis software - CreaPhase.git/blobdiff - octave_packages/nurbs-1.3.6/bspderiv.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / nurbs-1.3.6 / bspderiv.m
diff --git a/octave_packages/nurbs-1.3.6/bspderiv.m b/octave_packages/nurbs-1.3.6/bspderiv.m
new file mode 100644 (file)
index 0000000..8f455d5
--- /dev/null
@@ -0,0 +1,67 @@
+function [dc,dk] = bspderiv(d,c,k)
+
+% BSPDERIV:  B-Spline derivative.
+% 
+%  MATLAB SYNTAX:
+% 
+%         [dc,dk] = bspderiv(d,c,k)
+%  
+%  INPUT:
+% 
+%    d - degree of the B-Spline
+%    c - control points          double  matrix(mc,nc)
+%    k - knot sequence           double  vector(nk)
+% 
+%  OUTPUT:
+% 
+%    dc - control points of the derivative     double  matrix(mc,nc)
+%    dk - knot sequence of the derivative      double  vector(nk)
+% 
+%  Modified version of Algorithm A3.3 from 'The NURBS BOOK' pg98.
+%
+%    Copyright (C) 2000 Mark Spink, 2007 Daniel Claxton
+%
+%    This program is free software: you can redistribute it and/or modify
+%    it under the terms of the GNU General Public License as published by
+%    the Free Software Foundation, either version 2 of the License, or
+%    (at your option) any later version.
+
+%    This program is distributed in the hope that it will be useful,
+%    but WITHOUT ANY WARRANTY; without even the implied warranty of
+%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+%    GNU General Public License for more details.
+%
+%    You should have received a copy of the GNU General Public License
+%    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+[mc,nc] = size(c);
+nk = numel(k);
+                                                     %
+                                                     % int bspderiv(int d, double *c, int mc, int nc, double *k, int nk, double *dc,
+                                                     %              double *dk)
+                                                     % {
+                                                     %   int ierr = 0;
+                                                     %   int i, j, tmp;
+                                                     %
+                                                     %   // control points
+                                                     %   double **ctrl = vec2mat(c,mc,nc);
+                                                     %
+                                                     %   // control points of the derivative
+dc = zeros(mc,nc-1);                                 %   double **dctrl = vec2mat(dc,mc,nc-1);
+                                                     %
+for i=0:nc-2                                         %   for (i = 0; i < nc-1; i++) {
+   tmp = d / (k(i+d+2) - k(i+2));                    %     tmp = d / (k[i+d+1] - k[i+1]);
+   for j=0:mc-1                                      %     for (j = 0; j < mc; j++) {
+       dc(j+1,i+1) = tmp*(c(j+1,i+2) - c(j+1,i+1));  %       dctrl[i][j] = tmp * (ctrl[i+1][j] - ctrl[i][j]);
+   end                                               %     }
+end                                                  %   }
+                                                     %
+dk = zeros(1,nk-2);                                  %   j = 0;
+for i=1:nk-2                                         %   for (i = 1; i < nk-1; i++)
+   dk(i) = k(i+1);                                   %     dk[j++] = k[i];
+end                                                  %
+                                                     %   freevec2mat(dctrl);
+                                                     %   freevec2mat(ctrl);
+                                                     %
+                                                     %   return ierr;
+end                                                  % }