Mercurial > repos > public > sbplib
annotate +parametrization/Ti.m @ 633:6f4eb3da8978 bugfix/TiVectorInputs
Flip input and outputs if they are columnvectors.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Mon, 23 Oct 2017 16:29:52 +0200 |
parents | d98d9c79573f |
children | edb1d60b0b77 |
rev | line source |
---|---|
0 | 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) | |
633
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
24 if isrow(u) && isrow(v) |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
25 flipped = false; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
26 else |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
27 flipped = true; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
28 u = u'; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
29 v = v'; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
30 end |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
31 |
0 | 32 x1 = g1(u); |
33 x2 = g2(v); | |
34 x3 = g3(1-u); | |
35 x4 = g4(1-v); | |
633
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
36 |
0 | 37 o1 = (1-v).*x1(1,:) + u.*x2(1,:) + v.*x3(1,:) + (1-u).*x4(1,:) ... |
632
d98d9c79573f
Switch to elementwise multiplication where it was not used
Jonatan Werpers <jonatan@werpers.com>
parents:
544
diff
changeset
|
38 -((1-u).*(1-v).*A(1,:) + u.*(1-v).*B(1,:) + u.*v.*C(1,:) + (1-u).*v.*D(1,:)); |
0 | 39 o2 = (1-v).*x1(2,:) + u.*x2(2,:) + v.*x3(2,:) + (1-u).*x4(2,:) ... |
632
d98d9c79573f
Switch to elementwise multiplication where it was not used
Jonatan Werpers <jonatan@werpers.com>
parents:
544
diff
changeset
|
40 -((1-u).*(1-v).*A(2,:) + u.*(1-v).*B(2,:) + u.*v.*C(2,:) + (1-u).*v.*D(2,:)); |
0 | 41 |
633
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
42 if ~flipped |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
43 o = [o1;o2]; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
44 else |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
45 o = [o1'; o2']; |
6f4eb3da8978
Flip input and outputs if they are columnvectors.
Jonatan Werpers <jonatan@werpers.com>
parents:
632
diff
changeset
|
46 end |
0 | 47 end |
48 | |
49 obj.S = @S_fun; | |
50 end | |
51 | |
272
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
52 % Does this funciton make sense? |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
53 % Should it always be eval? |
0 | 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 | |
272
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
83 % Evaluate S for each pair of u and v, |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
84 % Return same shape as u |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
85 function [x, y] = eval(obj, u, v) |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
86 x = zeros(size(u)); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
87 y = zeros(size(u)); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
88 |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
89 for i = 1:numel(u) |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
90 p = obj.S(u(i), v(i)); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
91 x(i) = p(1,:); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
92 y(i) = p(2,:); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
93 end |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
94 end |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
95 |
0 | 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_bord = obj.plot(2,2); | |
137 set(h_bord,'Color',[0.8500 0.3250 0.0980]); | |
138 set(h_bord,'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 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
150 ti = parametrization.Ti(new_gs{:}); |
0 | 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 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
165 ti = parametrization.Ti(new_gs{:}); |
0 | 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 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
175 ti = parametrization.Ti(new_gs{:}); |
0 | 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 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
184 ti = parametrization.Ti(new_gs{:}); |
0 | 185 end |
186 end | |
187 | |
188 methods(Static) | |
189 function obj = points(p1, p2, p3, p4) | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
190 g1 = parametrization.Curve.line(p1,p2); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
191 g2 = parametrization.Curve.line(p2,p3); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
192 g3 = parametrization.Curve.line(p3,p4); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
193 g4 = parametrization.Curve.line(p4,p1); |
0 | 194 |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
195 obj = parametrization.Ti(g1,g2,g3,g4); |
0 | 196 end |
197 | |
544
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
198 function obj = rectangle(a, b) |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
199 p1 = a; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
200 p2 = [b(1), a(2)]; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
201 p3 = b; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
202 p4 = [a(1), b(2)]; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
203 |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
204 obj = parametrization.Ti.points(p1,p2,p3,p4); |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
205 end |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
206 |
332
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
207 % Like the constructor but allows inputing line curves as 2-cell arrays: |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
208 % example: parametrization.Ti.linesAndCurves(g1, g2, {a, b} g4) |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
209 function obj = linesAndCurves(C1, C2, C3, C4) |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
210 C = {C1, C2, C3, C4}; |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
211 c = cell(1,4); |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
212 |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
213 for i = 1:4 |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
214 if ~iscell(C{i}) |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
215 c{i} = C{i}; |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
216 else |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
217 c{i} = parametrization.Curve.line(C{i}{:}); |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
218 end |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
219 end |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
220 |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
221 obj = parametrization.Ti(c{:}); |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
222 end |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
223 |
0 | 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); | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
247 parametrization.place_label(pc,str); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
248 parametrization.place_label(pw,'w'); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
249 parametrization.place_label(pe,'e'); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
250 parametrization.place_label(ps,'s'); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
251 parametrization.place_label(pn,'n'); |
0 | 252 end |
253 end | |
254 end | |
255 end |