changeset 9404:29f6872a57d0 octave-forge

Added derivatives
author rafavzqz
date Mon, 06 Feb 2012 14:02:18 +0000
parents 2108d03d50de
children 869d0f838b63
files extra/nurbs/inst/private/onebasisfun__.m extra/nurbs/inst/private/onebasisfunder__.m extra/nurbs/inst/tbasisfun.m
diffstat 3 files changed, 90 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/extra/nurbs/inst/private/onebasisfun__.m	Mon Feb 06 13:48:17 2012 +0000
+++ b/extra/nurbs/inst/private/onebasisfun__.m	Mon Feb 06 14:02:18 2012 +0000
@@ -3,28 +3,32 @@
 %  __ONEBASISFUN__: Undocumented internal function
 %
 %   Copyright (C) 2009 Carlo de Falco
+%   Copyright (C) 2012 Rafael Vazquez
 %   This software comes with ABSOLUTELY NO WARRANTY; see the file
 %   COPYING for details.  This is free software, and you are welcome
 %   to distribute it under the conditions laid out in COPYING.
 
-  N = 0;
-  if (~ any (U <= u)) || (~ any (U > u))
-    return;
-  elseif (p == 0)
-      N = 1;
-      return;
-  end
+  N = zeros (size (u));
 
- ln = u - U(1);
- ld = U(end-1) - U(1);
- if (ld ~= 0)
-   N = N + ln * onebasisfun__ (u, p-1, U(1:end-1))/ ld; 
- end
+  for ii = 1:numel (u)
+    if (~ any (U <= u(ii))) || (~ any (U > u(ii)))
+      continue;
+    elseif (p == 0)
+      N(ii) = 1;
+      continue;
+    else
+      ln = u(ii) - U(1);
+      ld = U(end-1) - U(1);
+      if (ld ~= 0)
+        N(ii) = N(ii) + ln * onebasisfun__ (u(ii), p-1, U(1:end-1))/ ld; 
+      end
 
- dn = U(end) - u;
- dd = U(end) - U(2);
- if (dd ~= 0)
-   N = N + dn * onebasisfun__ (u, p-1, U(2:end))/ dd;
- end
+      dn = U(end) - u(ii);
+      dd = U(end) - U(2);
+      if (dd ~= 0)
+        N(ii) = N(ii) + dn * onebasisfun__ (u(ii), p-1, U(2:end))/ dd;
+      end
+    end
+  end
   
 end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extra/nurbs/inst/private/onebasisfunder__.m	Mon Feb 06 14:02:18 2012 +0000
@@ -0,0 +1,31 @@
+function N = onebasisfunder__ (u, p, U)
+
+%  __ONEBASISFUNDER__: Undocumented internal function
+%
+%   Copyright (C) 2012 Rafael Vazquez
+%   This software comes with ABSOLUTELY NO WARRANTY; see the file
+%   COPYING for details.  This is free software, and you are welcome
+%   to distribute it under the conditions laid out in COPYING.
+
+  N = zeros (size (u));
+
+  for ii = 1:numel (u)
+    if (~ any (U <= u(ii))) || (~ any (U > u(ii)))
+      continue;
+    elseif (p == 0)
+      N(ii) = 0;
+      continue;
+    else
+      ld = U(end-1) - U(1);
+      if (ld ~= 0)
+        N(ii) = N(ii) + p * onebasisfun__ (u(ii), p-1, U(1:end-1))/ ld;
+      end
+
+      dd = U(end) - U(2);
+      if (dd ~= 0)
+        N(ii) = N(ii) - p * onebasisfun__ (u(ii), p-1, U(2:end))/ dd;
+      end
+    end
+  end
+  
+end
--- a/extra/nurbs/inst/tbasisfun.m	Mon Feb 06 13:48:17 2012 +0000
+++ b/extra/nurbs/inst/tbasisfun.m	Mon Feb 06 14:02:18 2012 +0000
@@ -1,12 +1,12 @@
-function N = tbasisfun (u, p, U)
+function [N, Nder] = tbasisfunder (u, p, U)
 %
-% TBASISFUN: Compute a B- or T-Spline basis function from its local knot vector.
+% TBASISFUN: Compute a B- or T-Spline basis function, and its derivatives, from its local knot vector.
 %
 % usage:
 %
-% N = tbasisfun (u, p, U)
-% N = tbasisfun ([u; v], [p q], {U, V})
-% N = tbasisfun ([u; v; w], [p q r], {U, V, W})
+% [N, Nder] = tbasisfun (u, p, U)
+% [N, Nder] = tbasisfun ([u; v], [p q], {U, V})
+% [N, Nder] = tbasisfun ([u; v; w], [p q r], {U, V, W})
 % 
 % INPUT:
 %
@@ -19,9 +19,11 @@
 %
 % OUTPUT:
 %
-%  N : basis function evaluated at the given parametric points 
+%  N    : basis function evaluated at the given parametric points 
+%  Nder : basis function gradient evaluated at the given parametric points 
 %
 %    Copyright (C) 2009 Carlo de Falco
+%    Copyright (C) 2012 Rafael Vazquez
 %
 %    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
@@ -40,44 +42,48 @@
     U = sort (U);
     assert (numel (U) == p+2)
     
-    N = zeros(1,numel(u));
-    for ii=1:numel(u)
-      N(ii) = onebasisfun__ (u(ii), p, U);
+    N = onebasisfun__ (u, p, U);
+
+    if (nargout == 2)
+      Nder = onebasisfunder__ (u, p, U);
     end
-
-  elseif size(U,2) == 2
+    
+  elseif (size(U,2) == 2)
     U{1} = sort(U{1}); U{2} = sort(U{2});
     assert (numel(U{1}) == p(1)+2 && numel(U{2}) == p(2)+2)
     
-    Nu = zeros(1,numel(u(1,:))); Nv = zeros(1,numel(u(1,:)));
-    for ii=1:numel(u(1,:))
-      Nu(ii) = onebasisfun__ (u(1,ii), p(1), U{1});
-    end
-
-    for ii=1:numel(u(1,:))
-      Nv(ii) = onebasisfun__ (u(2,ii), p(2), U{2});
-    end
+    Nu = onebasisfun__ (u(1,:), p(1), U{1});
+    Nv = onebasisfun__ (u(2,:), p(2), U{2});
 
     N = Nu.*Nv;
 
-  elseif size(U,2) == 3
+    if (nargout == 2)
+      Ndu = onebasisfunder__ (u(1,:), p(1), U{1});
+      Ndv = onebasisfunder__ (u(2,:), p(2), U{2});
+      
+      Nder(1,:) = Ndu.*Nv;
+      Nder(2,:) = Nu.*Ndv;
+    end
+    
+  elseif (size(U,2) == 3)
     U{1} = sort(U{1}); U{2} = sort(U{2}); U{3} = sort(U{3});
     assert (numel(U{1}) == p(1)+2 && numel(U{2}) == p(2)+2 && numel(U{3}) == p(3)+2)
     
-    Nu = zeros(1,numel(u(1,:))); Nv = zeros(1,numel(u(1,:))); Nw = zeros(1,numel(u(1,:)));
-    for ii=1:numel(u(1,:))
-      Nu(ii) = onebasisfun__ (u(1,ii), p(1), U{1});
-    end
-
-    for ii=1:numel(u(1,:))
-      Nv(ii) = onebasisfun__ (u(2,ii), p(2), U{2});
-    end
-
-    for ii=1:numel(u(1,:))
-      Nw(ii) = onebasisfun__ (u(3,ii), p(3), U{3});
-    end
+    Nu = onebasisfun__ (u(1,:), p(1), U{1});
+    Nv = onebasisfun__ (u(2,:), p(2), U{2});
+    Nw = onebasisfun__ (u(3,:), p(3), U{3});
 
     N = Nu.*Nv.*Nw;
+
+    if (nargout == 2)
+      Ndu = onebasisfunder__ (u(1,:), p(1), U{1});
+      Ndv = onebasisfunder__ (u(2,:), p(2), U{2});
+      Ndw = onebasisfunder__ (u(3,:), p(3), U{3});
+      
+      Nder(1,:) = Ndu.*Nv.*Nw;
+      Nder(2,:) = Nu.*Ndv.*Nw;
+      Nder(3,:) = Nu.*Nv.*Ndw;
+    end
   end
 
 end