]> Creatis software - CreaPhase.git/blob - octave_packages/nurbs-1.3.6/private/onebasisfun__.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / nurbs-1.3.6 / private / onebasisfun__.m
1 function Nip = onebasisfun__ (u, p, U)
2
3 %  __ONEBASISFUN__: Undocumented internal function
4 %
5 %   Adapted from Algorithm A2.4 from 'The NURBS BOOK' pg74.
6 %
7 %   Copyright (C) 2009 Carlo de Falco
8 %   Copyright (C) 2012 Rafael Vazquez
9 %   This software comes with ABSOLUTELY NO WARRANTY; see the file
10 %   COPYING for details.  This is free software, and you are welcome
11 %   to distribute it under the conditions laid out in COPYING.
12
13   Nip = zeros (size (u));
14   N = zeros (p+1, 1);
15
16   for ii = 1:numel(u)
17     if ((u(ii) == U(1)) && (U(1) == U(end-1)) || ...
18         (u(ii) == U(end)) && (U(end) == U(2)))
19       Nip(ii) = 1;
20       continue
21     end
22     if (~ any (U <= u(ii))) || (~ any (U > u(ii)))
23       continue;
24     end
25     for jj = 1:p+1 % Initialize zero-th degree functions
26       if (u(ii) > U(jj) && u(ii) < U(jj+1))
27         N(jj) = 1;
28       else
29         N(jj) = 0;
30       end
31     end
32     for k = 1:p
33       if (N(1) == 0)
34         saved = 0;
35       else
36         saved = (u(ii) - U(1))*N(1) / (U(k+1)-U(1));
37       end
38
39       for jj = 1:p-k+1
40         Uleft = U(1+jj);
41         Uright = U(1+jj+k);
42         if (N(jj+1) == 0)
43           N(jj) = saved;
44           saved = 0;
45         else
46           temp = N(jj+1)/(Uright-Uleft);
47           N(jj) = saved + (Uright - u(ii))*temp;
48           saved = (u(ii) - Uleft)*temp;
49         end
50       end
51     end
52     Nip(ii) = N(1);
53   end
54
55
56 end