comparison +parametrization/Ti.m @ 151:3a3cf386bb7e feature/grids

Moved Curves and Tis from package grid to package parametrization.
author Jonatan Werpers <jonatan@werpers.com>
date Mon, 21 Dec 2015 15:09:32 +0100
parents +grid/Ti.m@48b6fb693025
children 81e0ead29431
comparison
equal deleted inserted replaced
150:d5a794c734bc 151:3a3cf386bb7e
1 classdef Ti
2 properties
3 gs % {4}Curve
4 S % FunctionHandle(u,v)
5 end
6
7 methods
8 % TODO function to label boundary names.
9 % function to find largest and smallest delta h in the grid. Maybe shouldnt live here
10 function obj = Ti(C1,C2,C3,C4)
11 obj.gs = {C1,C2,C3,C4};
12
13 g1 = C1.g;
14 g2 = C2.g;
15 g3 = C3.g;
16 g4 = C4.g;
17
18 A = g1(0);
19 B = g2(0);
20 C = g3(0);
21 D = g4(0);
22
23 function o = S_fun(u,v)
24 x1 = g1(u);
25 x2 = g2(v);
26 x3 = g3(1-u);
27 x4 = g4(1-v);
28 o1 = (1-v).*x1(1,:) + u.*x2(1,:) + v.*x3(1,:) + (1-u).*x4(1,:) ...
29 -((1-u)*(1-v).*A(1,:) + u*(1-v).*B(1,:) + u*v.*C(1,:) + (1-u)*v.*D(1,:));
30 o2 = (1-v).*x1(2,:) + u.*x2(2,:) + v.*x3(2,:) + (1-u).*x4(2,:) ...
31 -((1-u)*(1-v).*A(2,:) + u*(1-v).*B(2,:) + u*v.*C(2,:) + (1-u)*v.*D(2,:));
32
33 o = [o1;o2];
34 end
35
36 obj.S = @S_fun;
37 end
38
39 function [X,Y] = map(obj,u,v)
40 default_arg('v',u);
41
42 if isscalar(u)
43 u = linspace(0,1,u);
44 end
45
46 if isscalar(v)
47 v = linspace(0,1,v);
48 end
49
50 S = obj.S;
51
52 nu = length(u);
53 nv = length(v);
54
55 X = zeros(nv,nu);
56 Y = zeros(nv,nu);
57
58 u = rowVector(u);
59 v = rowVector(v);
60
61 for i = 1:nv
62 p = S(u,v(i));
63 X(i,:) = p(1,:);
64 Y(i,:) = p(2,:);
65 end
66 end
67
68 function h = plot(obj,nu,nv)
69 S = obj.S;
70
71 default_arg('nv',nu)
72
73 u = linspace(0,1,nu);
74 v = linspace(0,1,nv);
75
76 m = 100;
77
78 X = zeros(nu+nv,m);
79 Y = zeros(nu+nv,m);
80
81
82 t = linspace(0,1,m);
83 for i = 1:nu
84 p = S(u(i),t);
85 X(i,:) = p(1,:);
86 Y(i,:) = p(2,:);
87 end
88
89 for i = 1:nv
90 p = S(t,v(i));
91 X(i+nu,:) = p(1,:);
92 Y(i+nu,:) = p(2,:);
93 end
94
95 h = line(X',Y');
96 end
97
98
99 function h = show(obj,nu,nv)
100 default_arg('nv',nu)
101 S = obj.S;
102
103 if(nu>2 || nv>2)
104 h_grid = obj.plot(nu,nv);
105 set(h_grid,'Color',[0 0.4470 0.7410]);
106 end
107
108 h_bord = obj.plot(2,2);
109 set(h_bord,'Color',[0.8500 0.3250 0.0980]);
110 set(h_bord,'LineWidth',2);
111 end
112
113
114 % TRANSFORMATIONS
115 function ti = translate(obj,a)
116 gs = obj.gs;
117
118 for i = 1:length(gs)
119 new_gs{i} = gs{i}.translate(a);
120 end
121
122 ti = grid.Ti(new_gs{:});
123 end
124
125 % Mirrors the Ti so that the resulting Ti is still left handed.
126 % (Corrected by reversing curves and switching e and w)
127 function ti = mirror(obj, a, b)
128 gs = obj.gs;
129
130 new_gs = cell(1,4);
131
132 new_gs{1} = gs{1}.mirror(a,b).reverse();
133 new_gs{3} = gs{3}.mirror(a,b).reverse();
134 new_gs{2} = gs{4}.mirror(a,b).reverse();
135 new_gs{4} = gs{2}.mirror(a,b).reverse();
136
137 ti = grid.Ti(new_gs{:});
138 end
139
140 function ti = rotate(obj,a,rad)
141 gs = obj.gs;
142
143 for i = 1:length(gs)
144 new_gs{i} = gs{i}.rotate(a,rad);
145 end
146
147 ti = grid.Ti(new_gs{:});
148 end
149
150 function ti = rotate_edges(obj,n);
151 new_gs = cell(1,4);
152 for i = 0:3
153 new_i = mod(i - n,4);
154 new_gs{new_i+1} = obj.gs{i+1};
155 end
156 ti = grid.Ti(new_gs{:});
157 end
158 end
159
160 methods(Static)
161 function obj = points(p1, p2, p3, p4)
162 g1 = grid.Curve.line(p1,p2);
163 g2 = grid.Curve.line(p2,p3);
164 g3 = grid.Curve.line(p3,p4);
165 g4 = grid.Curve.line(p4,p1);
166
167 obj = grid.Ti(g1,g2,g3,g4);
168 end
169
170 function label(varargin)
171 if nargin == 2 && ischar(varargin{2})
172 label_impl(varargin{:});
173 else
174 for i = 1:length(varargin)
175 label_impl(varargin{i},inputname(i));
176 end
177 end
178
179
180 function label_impl(ti,str)
181 S = ti.S;
182
183 pc = S(0.5,0.5);
184
185 margin = 0.1;
186 pw = S( margin, 0.5);
187 pe = S(1-margin, 0.5);
188 ps = S( 0.5, margin);
189 pn = S( 0.5, 1-margin);
190
191
192 ti.show(2,2);
193 grid.place_label(pc,str);
194 grid.place_label(pw,'w');
195 grid.place_label(pe,'e');
196 grid.place_label(ps,'s');
197 grid.place_label(pn,'n');
198 end
199 end
200 end
201 end