Mercurial > repos > public > sbplib
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 |