annotate extra/nurbs/inst/basiskntins.m @ 12668:7623d14dd29c octave-forge

Change in the help
author rafavzqz
date Tue, 28 Jul 2015 10:24:59 +0000
parents e3998369a32e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12641
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
1 function S = basiskntins (deg,t,u)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
2
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
3 % Compute the coefficient matrix for non-uniform B-splines subdivision.
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
4 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
5 % This represents the B-spline basis given by a coarse knot vector
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
6 % in terms of the B-spline basis of a finer knot vector.
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
7 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
8 % The function is implemented for the univariate case. It is based on
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
9 % the paper:
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
10 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
11 % G. Casciola, L. Romani, A general matrix representation for non-uniform
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
12 % B-spline subdivision with boundary control, ALMA-DL, University of Bologna (2007)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
13 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
14 % Calling Sequence:
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
15 %
12668
7623d14dd29c Change in the help
rafavzqz
parents: 12641
diff changeset
16 % S = basiskntins (deg, t, u);
12641
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
17 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
18 % INPUT:
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
19 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
20 % deg - degree of the first knot vector
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
21 % t - coarse knot vector
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
22 % u - fine knot vector
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
23 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
24 % OUTPUT:
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
25 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
26 % B - Value of the basis functions at the points
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
27 % size(B)=[numel(u),(p+1)] for curves
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
28 % or [numel(u)*numel(v), (p+1)*(q+1)] for surfaces
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
29 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
30 % N - Indices of the basis functions that are nonvanishing at each
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
31 % point. size(N) == size(B)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
32 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
33 % Copyright (C) 2015 Rafael Vazquez
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
34 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
35 % This program is free software: you can redistribute it and/or modify
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
36 % it under the terms of the GNU General Public License as published by
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
37 % the Free Software Foundation, either version 3 of the License, or
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
38 % (at your option) any later version.
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
39
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
40 % This program is distributed in the hope that it will be useful,
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
41 % but WITHOUT ANY WARRANTY; without even the implied warranty of
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
42 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
43 % GNU General Public License for more details.
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
44 %
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
45 % You should have received a copy of the GNU General Public License
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
46 % along with this program. If not, see <http://www.gnu.org/licenses/>.
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
47
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
48 nt = length(t);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
49 nu = length(u);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
50 S = sparse (nu-deg-1,nt-deg-1);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
51 [t_mult,t_single,nt_s] = knot_mult(deg,t);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
52 [u_mult,u_single,nu_s] = knot_mult(deg,u);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
53 st = deg+1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
54 su = deg+1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
55 row = 1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
56 col = 1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
57 Sl = bs2bs(deg,t,u,st,su);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
58 S(row:deg+row,col:deg+col) = Sl;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
59 t_single(nt+1) = t(nt-deg);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
60 i = 1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
61
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
62 for j=1:nu_s
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
63 if (u_single(j) == t_single(i))
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
64 st = st+t_mult(i);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
65 col = col+t_mult(i);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
66 i = i+1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
67 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
68 su = su+u_mult(j);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
69 row = row+u_mult(j);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
70 Sl = bs2bs(deg,t,u,st,su);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
71 S(row:deg+row,col:deg+col) = Sl;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
72 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
73
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
74 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
75
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
76
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
77 function [t_mult,t_single,nt_s] = knot_mult(d,t)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
78 epsilon = 1e-14 * (t(end) - t(1));
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
79
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
80 nt = length(t);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
81 nt_s = 0;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
82 m = 1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
83 for i = d+2:nt-d-1
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
84 if ((t(i+1) - t(i)) > epsilon)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
85 nt_s = nt_s+1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
86 t_mult(nt_s) = m;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
87 t_single(nt_s) = t(i);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
88 m=1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
89 else
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
90 m = m+1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
91 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
92 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
93 t_single(nt_s+1)=t(nt-d);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
94 t_mult(nt_s+1)=0;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
95
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
96 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
97
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
98 function S = bs2bs(d,t,u,k,l)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
99
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
100 S = zeros(d+1);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
101 S(1,:) = bs2bs_first_row(d,t,u,k,l);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
102
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
103 for ir=1:d
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
104 S(ir+1,:) = bs2bs_i_row(d,t,u,k,l,ir,S(ir,:));
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
105 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
106 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
107
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
108 function S = bs2bs_first_row(d,t,u,k,l)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
109
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
110 S = eye(1,d+1);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
111 for h=1:d
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
112 beta_2=0.0;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
113 uu=u(l+1-h);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
114 for j=h:-1:1
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
115 d1=uu-t(k+j-h);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
116 d2=t(k+j)-uu;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
117 beta_1=S(j)/(d2+d1);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
118 S(j+1)=d1*beta_1+beta_2;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
119 beta_2=d2*beta_1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
120 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
121 S(1)=beta_2;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
122 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
123 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
124
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
125 function Si = bs2bs_i_row(d,t,u,k,l,ir,S)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
126
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
127 Si(1) = S(1)*(t(k+1)-u(l+ir))/(t(k+1)-u(l+ir-d));
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
128
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
129 for j=1:d
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
130 den=t(k+j+1)-u(l+ir-d);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
131 fact=(t(k+j+1)-t(k+j-d))/(t(k+j)-t(k+j-d-1));
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
132 Si(j+1)=(fact*(S(j)*(u(l+ir)-t(k+j-d-1))-Si(j) * ...
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
133 (u(l+ir-d)-t(k+j-d-1)))+S(j+1)*(t(k+j+1)-u(l+ir)))/den;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
134 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
135 end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
136
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
137 %!test
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
138 %! knt1 = [0 0 0 1/2 1 1 1];
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
139 %! knt2 = [0 0 0 1/4 1/2 3/4 1 1 1];
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
140 %! C = basiskntins (2, knt1, knt2);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
141 %! assert (full(C), [1 0 0 0; 1/2 1/2 0 0; 0 3/4 1/4 0; 0 1/4 3/4 0; 0 0 1/2 1/2; 0 0 0 1]);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
142
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
143 %!test
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
144 %! crv = nrbtestcrv;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
145 %! crv2 = nrbkntins (crv, [0.1, 0.3, 0.4, 0.5, 0.6, 0.8, 0.96 0.98]);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
146 %! C = basiskntins (crv.order-1,crv.knots,crv2.knots);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
147 %! for ii = 1:4
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
148 %! assert (max (abs(C*crv.coefs(ii,:)' - crv2.coefs(ii,:)')) < 1e-14 )
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
149 %! end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
150
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
151 %!test
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
152 %! crv = nrbtestcrv;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
153 %! crv2 = nrbkntins (crv, [0.50000001, 0.5000001, 0.500001, 0.50001, 0.5001]);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
154 %! C = basiskntins (crv.order-1,crv.knots,crv2.knots);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
155 %! for ii = 1:4
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
156 %! assert (max (abs(C*crv.coefs(ii,:)' - crv2.coefs(ii,:)')) < 1e-14 )
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
157 %! end
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
158
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
159 %!test
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
160 %! crv = nrbtestcrv;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
161 %! crv2 = nrbkntins (crv, [0.1, 0.3, 0.4, 0.5, 0.6, 0.8, 0.96 0.98]);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
162 %! C = basiskntins (crv.order-1,crv.knots,crv2.knots);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
163 %! x = linspace (0, 1, 10);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
164 %! s = findspan (crv.number-1, crv.order-1, x, crv.knots);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
165 %! s2 = findspan (crv2.number-1, crv2.order-1, x, crv2.knots);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
166 %! N = basisfun (s, x, crv.order-1, crv.knots);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
167 %! N2 = basisfun (s2, x, crv2.order-1, crv2.knots);
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
168 %! c = numbasisfun (s, x, crv.order-1, crv.knots) + 1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
169 %! c2 = numbasisfun (s2, x, crv2.order-1, crv2.knots) + 1;
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
170 %! for ii = 1:numel(x)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
171 %! assert (abs(N2(ii,:) * C(c2(ii,:),c(ii,:)) - N(ii,:)) < 1e-14)
e3998369a32e Added function to compute subdivision coefficients
rafavzqz
parents:
diff changeset
172 %! end