changeset 9484:a4a172117b12 octave-forge

Changes to save time
author rafavzqz
date Thu, 23 Feb 2012 14:01:42 +0000
parents 1b4fbdbf6429
children 0aeda1c01232
files extra/nurbs/inst/private/onebasisfun__.m extra/nurbs/inst/tbasisfun.m extra/nurbs/src/tbasisfun.cc
diffstat 3 files changed, 67 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/extra/nurbs/inst/private/onebasisfun__.m	Thu Feb 23 13:32:58 2012 +0000
+++ b/extra/nurbs/inst/private/onebasisfun__.m	Thu Feb 23 14:01:42 2012 +0000
@@ -16,6 +16,32 @@
     elseif (p == 0)
       N(ii) = 1;
       continue;
+    elseif (p == 1)
+      if (u(ii) < U(2))
+        N(ii) = (u(ii) - U(1)) / (U(2) - U(1));
+        continue;
+      else
+        N(ii) = (U(end) - u(ii)) / (U(3) - U(2));
+        continue;
+      end
+
+    elseif (p == 2)
+      if (u(ii) < U(2))
+        N(ii) = (u(ii) - U(1))^2 / ((U(3) - U(1)) * (U(2) - U(1)));
+        continue;
+      elseif (u(ii) > U(3))
+        N(ii) = (U(4) - u(ii))^2 / ((U(4) - U(2)) * (U(4) - U(3)));
+        continue;
+      else
+        ld = U(3) - U(1); dd = U(4) - U(2);
+        if (ld ~= 0)
+          N(ii) = N(ii) + (u(ii) - U(1))*(U(3) - u(ii)) / ((U(3) - U(2)) * ld);
+        end
+        if (dd ~= 0)
+          N(ii) = N(ii) + (U(4) - u(ii))*(u(ii) - U(2)) / ((U(3) - U(2)) * dd);
+        end
+      end
+
     else
       ln = u(ii) - U(1);
       ld = U(end-1) - U(1);
--- a/extra/nurbs/inst/tbasisfun.m	Thu Feb 23 13:32:58 2012 +0000
+++ b/extra/nurbs/inst/tbasisfun.m	Thu Feb 23 14:01:42 2012 +0000
@@ -40,7 +40,9 @@
   
   if (~ iscell (U))
     U = sort (U);
-    assert (numel (U) == p+2)
+    if (numel (U) ~= p+2)
+      error ('tbasisfun: knot vector and degree do not correspond')
+    end
     
     N = onebasisfun__ (u, p, U);
 
@@ -50,7 +52,9 @@
     
   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)
+    if (numel(U{1}) ~= p(1)+2 || numel(U{2}) ~= p(2)+2)
+      error ('tbasisfun: knot vector and degree do not correspond')
+    end
     
     Nu = onebasisfun__ (u(1,:), p(1), U{1});
     Nv = onebasisfun__ (u(2,:), p(2), U{2});
@@ -67,8 +71,10 @@
     
   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)
-    
+    if (numel(U{1}) ~= p(1)+2 || numel(U{2}) ~= p(2)+2 || numel(U{3}) ~= p(3)+2)
+      error ('tbasisfun: knot vector and degree do not correspond')
+    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});
--- a/extra/nurbs/src/tbasisfun.cc	Thu Feb 23 13:32:58 2012 +0000
+++ b/extra/nurbs/src/tbasisfun.cc	Thu Feb 23 14:01:42 2012 +0000
@@ -28,6 +28,37 @@
     return (N);
   else if (p == 0)
     return (1.0);
+  else if (p == 1) {
+    if (u < U(1)) {
+      N = (u - U(0)) / (U(1) - U(0));
+      return (N);
+    }
+    else {
+      N = (U(2) - u) / (U(2) - U(1));
+      return (N);
+    }
+  }
+  else if (p == 2) {
+    double ln = u - U(0);
+    double dn = U(3) - u;
+    double ld = U(2) - U(0); 
+    double dd = U(3) - U(1);
+    if (u < U(1)) {
+      N = ln*ln / (ld * (U(1) - U(0)));
+      return (N);
+    }
+    else if (u > U(2)) {
+      N = dn*dn / (dd * (U(3) - U(2)));
+      return (N);
+    }
+    else {
+      if (ld != 0)
+        N = N + ln * (U(2) - u) / ((U(2) - U(1)) * ld);
+      if (dd != 0)
+        N = N + dn * (u - U(1)) / ((U(2) - U(1)) * dd);
+      return (N);
+    }
+  }
  
   double ln = u - U(0);
   double ld = U(U.length () - 2) - U(0);