annotate extra/nurbs/src/tbasisfun.cc @ 6958:23ff23c91d06 octave-forge

Slight modifications in the help
author rafavzqz
date Wed, 31 Mar 2010 11:00:58 +0000
parents 53d47faf74bf
children 937278c100fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
1 /* Copyright (C) 2009 Carlo de Falco
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
2
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
3 This program is free software: you can redistribute it and/or modify
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
4 it under the terms of the GNU General Public License as published by
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
5 the Free Software Foundation, either version 2 of the License, or
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
6 (at your option) any later version.
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
7
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
8 This program is distributed in the hope that it will be useful,
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
11 GNU General Public License for more details.
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
12
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
13 You should have received a copy of the GNU General Public License
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
14 along with this program. If not, see <http://www.gnu.org/licenses/>.
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
15 */
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
16
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
17 #include <octave/oct.h>
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
18 #include <iostream>
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
19
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
20 double onebasisfun__ (double u, octave_idx_type p, RowVector U)
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
21 {
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
22
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
23 //std::cout << "u=" << u << " " << "p=" << p << " \n" << "U=" << U;
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
24
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
25 double N = 0.0;
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
26 if ((u < U.min ()) || ( u > U.max ()))
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
27 return (N);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
28 else if (p == 0)
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
29 return (1.0);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
30
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
31 double ln = u - U(0);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
32 double ld = U(U.length () - 2) - U(0);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
33 if (ld != 0)
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
34 N += ln * onebasisfun__ (u, p-1, U.extract (0, U.length () - 2))/ ld;
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
35
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
36 double dn = U(U.length () - 1) - u;
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
37 double dd = U(U.length () - 1) - U(1);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
38 if (dd != 0)
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
39 N += dn * onebasisfun__ (u, p-1, U.extract (1, U.length () - 1))/ dd;
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
40
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
41 return (N);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
42 }
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
43
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
44
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
45 DEFUN_DLD(tbasisfun, args, nargout,"\
6464
53d47faf74bf fixed test failures
cdf
parents: 6052
diff changeset
46 TBASISFUN: Compute a B- or T-Spline basis function from its local knot vector.\n\
53d47faf74bf fixed test failures
cdf
parents: 6052
diff changeset
47 \n\
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
48 usage:\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
49 \n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
50 N = tbasisfun (u, p, U)\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
51 N = tbasisfun ([u; v], [p q], {U, V})\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
52 \n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
53 INPUT:\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
54 u or [u; v] : points in parameter space where the basis function is to be\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
55 evaluated \n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
56 \n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
57 U or {U, V} : local knot vector\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
58 \n\
6958
23ff23c91d06 Slight modifications in the help
rafavzqz
parents: 6464
diff changeset
59 p or [p q] : polynomial order of the basis function\n\
6052
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
60 \n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
61 OUTPUT:\n\
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
62 N : basis function evaluated at the given parametric points\n")
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
63
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
64 {
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
65
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
66 Matrix u = args(0).matrix_value ();
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
67
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
68 if (! args(2).is_cell ())
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
69 {
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
70
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
71 double p = args(1).idx_type_value ();
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
72 RowVector U = args(2).row_vector_value (true, true);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
73 assert (U.numel () == p+2);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
74
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
75 RowVector N(u.cols ());
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
76 for (octave_idx_type ii=0; ii<u.numel (); ii++)
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
77 N(ii) = onebasisfun__ (u(ii), p, U);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
78
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
79 } else {
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
80
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
81 RowVector p = args(1).row_vector_value ();
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
82 Cell C = args(2).cell_value ();
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
83 RowVector U = C(0).row_vector_value (true, true);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
84 RowVector V = C(1).row_vector_value (true, true);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
85
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
86
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
87 RowVector N(u.cols ());
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
88 for (octave_idx_type ii=0; ii<u.cols (); ii++)
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
89 {
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
90 N(ii) = onebasisfun__ (u(0, ii), octave_idx_type(p(0)), U) *
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
91 onebasisfun__ (u(1, ii), octave_idx_type(p(1)), V);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
92 //std::cout << "N=" << N(ii) << "\n\n\n";
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
93 }
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
94 return octave_value (N);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
95 }
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
96 }
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
97
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
98
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
99 /*
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
100 %!demo
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
101 %! U = {[0 0 1/2 1 1], [0 0 0 1 1]};
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
102 %! p = [3, 3];
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
103 %! [X, Y] = meshgrid (linspace(0, 1, 30));
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
104 %! u = [X(:), Y(:)]';
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
105 %! N = tbasisfun (u, p, U);
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
106 %! surf (X, Y, reshape (N, size(X)))
a30089ac3de9 surface derivatives
cdf
parents:
diff changeset
107 */