annotate +grid/bspline.m @ 1301:8978521b0f06 default

Fix incorrect package name.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Wed, 08 Jul 2020 19:11:04 +0200
parents 4f7930d2d2c4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
197
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 % Calculates a D dimensional p-order bspline at t with knots T and control points P.
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 % T = [t0 t1 t2 ... tm] is a 1 x (m+1) vector with non-decresing elements and t0 = 0 tm = 1.
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
3 % P = [P0 P1 P2 ... Pn] is a D x (n+1) matrix.
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5 % knots p+1 to m-p-1 are the internal knots
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 % Implemented from: http://mathworld.wolfram.com/B-Spline.html
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
8 function C = bspline(t,p,P,T)
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
9 m = length(T) - 1;
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10 n = size(P,2) - 1;
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11 D = size(P,1);
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
13 assert(p == m - n - 1);
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
14
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
15 C = zeros(D,length(t));
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
16
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17 for i = 0:n
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18 for k = 1:D
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
19 C(k,:) = C(k,:) + P(k,1+i)*B(i,p,t,T);
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
20 end
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
21 end
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
22
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
23 % Curve not defined for t = 1 ? Ugly fix:
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
24 I = find(t == 1);
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
25 C(:,I) = repmat(P(:,end),[1,length(I)]);
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
26 end
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
27
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
28 function o = B(i, j, t, T)
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
29 if j == 0
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
30 o = T(1+i) <= t & t < T(1+i+1);
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
31 return
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
32 end
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
33
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
34 if T(1+i+j)-T(1+i) ~= 0
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
35 a = (t-T(1+i))/(T(1+i+j)-T(1+i));
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36 else
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37 a = t*0;
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
38 end
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
39
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
40 if T(1+i+j+1)-T(1+i+1) ~= 0
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
41 b = (T(1+i+j+1)-t)/(T(1+i+j+1)-T(1+i+1));
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
42 else
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43 b = t*0;
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44 end
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46 o = a.*B(i, j-1, t, T) + b.*B(i+1, j-1, t, T);
4f7930d2d2c4 Added function to calculate bspline.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47 end