comparison +parametrization/Ti.m @ 820:501750fbbfdb

Merge with feature/grids
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 07 Sep 2018 14:40:58 +0200
parents edb1d60b0b77
children
comparison
equal deleted inserted replaced
819:fdf0ef9150f4 820:501750fbbfdb
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 if isrow(u) && isrow(v)
25 flipped = false;
26 else
27 flipped = true;
28 u = u';
29 v = v';
30 end
31
32 x1 = g1(u);
33 x2 = g2(v);
34 x3 = g3(1-u);
35 x4 = g4(1-v);
36
37 o1 = (1-v).*x1(1,:) + u.*x2(1,:) + v.*x3(1,:) + (1-u).*x4(1,:) ...
38 -((1-u).*(1-v).*A(1,:) + u.*(1-v).*B(1,:) + u.*v.*C(1,:) + (1-u).*v.*D(1,:));
39 o2 = (1-v).*x1(2,:) + u.*x2(2,:) + v.*x3(2,:) + (1-u).*x4(2,:) ...
40 -((1-u).*(1-v).*A(2,:) + u.*(1-v).*B(2,:) + u.*v.*C(2,:) + (1-u).*v.*D(2,:));
41
42 if ~flipped
43 o = [o1;o2];
44 else
45 o = [o1'; o2'];
46 end
47 end
48
49 obj.S = @S_fun;
50 end
51
52 % Does this funciton make sense?
53 % Should it always be eval?
54 function [X,Y] = map(obj,u,v)
55 default_arg('v',u);
56
57 if isscalar(u)
58 u = linspace(0,1,u);
59 end
60
61 if isscalar(v)
62 v = linspace(0,1,v);
63 end
64
65 S = obj.S;
66
67 nu = length(u);
68 nv = length(v);
69
70 X = zeros(nv,nu);
71 Y = zeros(nv,nu);
72
73 u = rowVector(u);
74 v = rowVector(v);
75
76 for i = 1:nv
77 p = S(u,v(i));
78 X(i,:) = p(1,:);
79 Y(i,:) = p(2,:);
80 end
81 end
82
83 % Evaluate S for each pair of u and v,
84 % Return same shape as u
85 function [x, y] = eval(obj, u, v)
86 x = zeros(size(u));
87 y = zeros(size(u));
88
89 for i = 1:numel(u)
90 p = obj.S(u(i), v(i));
91 x(i) = p(1,:);
92 y(i) = p(2,:);
93 end
94 end
95
96 function h = plot(obj,nu,nv)
97 S = obj.S;
98
99 default_arg('nv',nu)
100
101 u = linspace(0,1,nu);
102 v = linspace(0,1,nv);
103
104 m = 100;
105
106 X = zeros(nu+nv,m);
107 Y = zeros(nu+nv,m);
108
109
110 t = linspace(0,1,m);
111 for i = 1:nu
112 p = S(u(i),t);
113 X(i,:) = p(1,:);
114 Y(i,:) = p(2,:);
115 end
116
117 for i = 1:nv
118 p = S(t,v(i));
119 X(i+nu,:) = p(1,:);
120 Y(i+nu,:) = p(2,:);
121 end
122
123 h = line(X',Y');
124 end
125
126
127 function h = show(obj,nu,nv)
128 default_arg('nv',nu)
129 S = obj.S;
130
131 if(nu>2 || nv>2)
132 h.grid = obj.plot(nu,nv);
133 set(h.grid,'Color',[0 0.4470 0.7410]);
134 end
135
136 h.border = obj.plot(2,2);
137 set(h.border,'Color',[0.8500 0.3250 0.0980]);
138 set(h.border,'LineWidth',2);
139 end
140
141
142 % TRANSFORMATIONS
143 function ti = translate(obj,a)
144 gs = obj.gs;
145
146 for i = 1:length(gs)
147 new_gs{i} = gs{i}.translate(a);
148 end
149
150 ti = parametrization.Ti(new_gs{:});
151 end
152
153 % Mirrors the Ti so that the resulting Ti is still left handed.
154 % (Corrected by reversing curves and switching e and w)
155 function ti = mirror(obj, a, b)
156 gs = obj.gs;
157
158 new_gs = cell(1,4);
159
160 new_gs{1} = gs{1}.mirror(a,b).reverse();
161 new_gs{3} = gs{3}.mirror(a,b).reverse();
162 new_gs{2} = gs{4}.mirror(a,b).reverse();
163 new_gs{4} = gs{2}.mirror(a,b).reverse();
164
165 ti = parametrization.Ti(new_gs{:});
166 end
167
168 function ti = rotate(obj,a,rad)
169 gs = obj.gs;
170
171 for i = 1:length(gs)
172 new_gs{i} = gs{i}.rotate(a,rad);
173 end
174
175 ti = parametrization.Ti(new_gs{:});
176 end
177
178 function ti = rotate_edges(obj,n);
179 new_gs = cell(1,4);
180 for i = 0:3
181 new_i = mod(i - n,4);
182 new_gs{new_i+1} = obj.gs{i+1};
183 end
184 ti = parametrization.Ti(new_gs{:});
185 end
186 end
187
188 methods(Static)
189 function obj = points(p1, p2, p3, p4)
190 g1 = parametrization.Curve.line(p1,p2);
191 g2 = parametrization.Curve.line(p2,p3);
192 g3 = parametrization.Curve.line(p3,p4);
193 g4 = parametrization.Curve.line(p4,p1);
194
195 obj = parametrization.Ti(g1,g2,g3,g4);
196 end
197
198 function obj = rectangle(a, b)
199 p1 = a;
200 p2 = [b(1), a(2)];
201 p3 = b;
202 p4 = [a(1), b(2)];
203
204 obj = parametrization.Ti.points(p1,p2,p3,p4);
205 end
206
207 % Like the constructor but allows inputing line curves as 2-cell arrays:
208 % example: parametrization.Ti.linesAndCurves(g1, g2, {a, b} g4)
209 function obj = linesAndCurves(C1, C2, C3, C4)
210 C = {C1, C2, C3, C4};
211 c = cell(1,4);
212
213 for i = 1:4
214 if ~iscell(C{i})
215 c{i} = C{i};
216 else
217 c{i} = parametrization.Curve.line(C{i}{:});
218 end
219 end
220
221 obj = parametrization.Ti(c{:});
222 end
223
224 function label(varargin)
225 if nargin == 2 && ischar(varargin{2})
226 label_impl(varargin{:});
227 else
228 for i = 1:length(varargin)
229 label_impl(varargin{i},inputname(i));
230 end
231 end
232
233
234 function label_impl(ti,str)
235 S = ti.S;
236
237 pc = S(0.5,0.5);
238
239 margin = 0.1;
240 pw = S( margin, 0.5);
241 pe = S(1-margin, 0.5);
242 ps = S( 0.5, margin);
243 pn = S( 0.5, 1-margin);
244
245
246 ti.show(2,2);
247 parametrization.place_label(pc,str);
248 parametrization.place_label(pw,'w');
249 parametrization.place_label(pe,'e');
250 parametrization.place_label(ps,'s');
251 parametrization.place_label(pn,'n');
252 end
253 end
254 end
255 end