Mercurial > forge
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);