1 #include "sbasis-2d.h"
3 namespace Geom{
5 SBasis extract_u(SBasis2d const &a, double u) {
6 SBasis sb;
7 double s = u*(1-u);
9 for(unsigned vi = 0; vi < a.vs; vi++) {
10 double sk = 1;
11 Linear bo(0,0);
12 for(unsigned ui = 0; ui < a.us; ui++) {
13 bo += (extract_u(a.index(ui, vi), u))*sk;
14 sk *= s;
15 }
16 sb.push_back(bo);
17 }
19 return sb;
20 }
22 SBasis extract_v(SBasis2d const &a, double v) {
23 SBasis sb;
24 double s = v*(1-v);
26 for(unsigned ui = 0; ui < a.us; ui++) {
27 double sk = 1;
28 Linear bo(0,0);
29 for(unsigned vi = 0; vi < a.vs; vi++) {
30 bo += (extract_v(a.index(ui, vi), v))*sk;
31 sk *= s;
32 }
33 sb.push_back(bo);
34 }
36 return sb;
37 }
39 SBasis compose(Linear2d const &a, D2<SBasis> const &p) {
40 D2<SBasis> omp(-p[X] + 1, -p[Y] + 1);
41 return multiply(omp[0], omp[1])*a[0] +
42 multiply(p[0], omp[1])*a[1] +
43 multiply(omp[0], p[1])*a[2] +
44 multiply(p[0], p[1])*a[3];
45 }
47 SBasis
48 compose(SBasis2d const &fg, D2<SBasis> const &p) {
49 SBasis B;
50 SBasis s[2];
51 SBasis ss[2];
52 for(unsigned dim = 0; dim < 2; dim++)
53 s[dim] = p[dim]*(Linear(1) - p[dim]);
54 ss[1] = Linear(1);
55 for(unsigned vi = 0; vi < fg.vs; vi++) {
56 ss[0] = ss[1];
57 for(unsigned ui = 0; ui < fg.us; ui++) {
58 unsigned i = ui + vi*fg.us;
59 B += ss[0]*compose(fg[i], p);
60 ss[0] *= s[0];
61 }
62 ss[1] *= s[1];
63 }
64 return B;
65 }
67 D2<SBasis>
68 compose_each(D2<SBasis2d> const &fg, D2<SBasis> const &p) {
69 return D2<SBasis>(compose(fg[X], p), compose(fg[Y], p));
70 }
72 };