annotate +grid/bspline.m @ 577:e45c9b56d50d feature/grids

Add an Empty grid class The need turned up for the flexural code when we may or may not have a grid for the open water and want to plot that solution. In case there is no open water we need an empty grid to plot the empty gridfunction against to avoid errors.
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 07 Sep 2017 09:16:12 +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