Mercurial > repos > public > sbplib
annotate +parametrization/Ti.m @ 577:e45c9b56d50d feature/grids
Add an Empty grid class
The need turned up for the flexural code when we may or may not have a grid for the open water and want to plot that solution.
In case there is no open water we need an empty grid to plot the empty gridfunction against to avoid errors.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Thu, 07 Sep 2017 09:16:12 +0200 |
parents | 433ccb5d2f0f |
children | d98d9c79573f |
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) | |
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 | |
272
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
39 % Does this funciton make sense? |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
40 % Should it always be eval? |
0 | 41 function [X,Y] = map(obj,u,v) |
42 default_arg('v',u); | |
43 | |
44 if isscalar(u) | |
45 u = linspace(0,1,u); | |
46 end | |
47 | |
48 if isscalar(v) | |
49 v = linspace(0,1,v); | |
50 end | |
51 | |
52 S = obj.S; | |
53 | |
54 nu = length(u); | |
55 nv = length(v); | |
56 | |
57 X = zeros(nv,nu); | |
58 Y = zeros(nv,nu); | |
59 | |
60 u = rowVector(u); | |
61 v = rowVector(v); | |
62 | |
63 for i = 1:nv | |
64 p = S(u,v(i)); | |
65 X(i,:) = p(1,:); | |
66 Y(i,:) = p(2,:); | |
67 end | |
68 end | |
69 | |
272
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
70 % Evaluate S for each pair of u and v, |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
71 % Return same shape as u |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
72 function [x, y] = eval(obj, u, v) |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
73 x = zeros(size(u)); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
74 y = zeros(size(u)); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
75 |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
76 for i = 1:numel(u) |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
77 p = obj.S(u(i), v(i)); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
78 x(i) = p(1,:); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
79 y(i) = p(2,:); |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
80 end |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
81 end |
9fe423849525
Added evalfunction to Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
248
diff
changeset
|
82 |
0 | 83 function h = plot(obj,nu,nv) |
84 S = obj.S; | |
85 | |
86 default_arg('nv',nu) | |
87 | |
88 u = linspace(0,1,nu); | |
89 v = linspace(0,1,nv); | |
90 | |
91 m = 100; | |
92 | |
93 X = zeros(nu+nv,m); | |
94 Y = zeros(nu+nv,m); | |
95 | |
96 | |
97 t = linspace(0,1,m); | |
98 for i = 1:nu | |
99 p = S(u(i),t); | |
100 X(i,:) = p(1,:); | |
101 Y(i,:) = p(2,:); | |
102 end | |
103 | |
104 for i = 1:nv | |
105 p = S(t,v(i)); | |
106 X(i+nu,:) = p(1,:); | |
107 Y(i+nu,:) = p(2,:); | |
108 end | |
109 | |
110 h = line(X',Y'); | |
111 end | |
112 | |
113 | |
114 function h = show(obj,nu,nv) | |
115 default_arg('nv',nu) | |
116 S = obj.S; | |
117 | |
118 if(nu>2 || nv>2) | |
119 h_grid = obj.plot(nu,nv); | |
120 set(h_grid,'Color',[0 0.4470 0.7410]); | |
121 end | |
122 | |
123 h_bord = obj.plot(2,2); | |
124 set(h_bord,'Color',[0.8500 0.3250 0.0980]); | |
125 set(h_bord,'LineWidth',2); | |
126 end | |
127 | |
128 | |
129 % TRANSFORMATIONS | |
130 function ti = translate(obj,a) | |
131 gs = obj.gs; | |
132 | |
133 for i = 1:length(gs) | |
134 new_gs{i} = gs{i}.translate(a); | |
135 end | |
136 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
137 ti = parametrization.Ti(new_gs{:}); |
0 | 138 end |
139 | |
140 % Mirrors the Ti so that the resulting Ti is still left handed. | |
141 % (Corrected by reversing curves and switching e and w) | |
142 function ti = mirror(obj, a, b) | |
143 gs = obj.gs; | |
144 | |
145 new_gs = cell(1,4); | |
146 | |
147 new_gs{1} = gs{1}.mirror(a,b).reverse(); | |
148 new_gs{3} = gs{3}.mirror(a,b).reverse(); | |
149 new_gs{2} = gs{4}.mirror(a,b).reverse(); | |
150 new_gs{4} = gs{2}.mirror(a,b).reverse(); | |
151 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
152 ti = parametrization.Ti(new_gs{:}); |
0 | 153 end |
154 | |
155 function ti = rotate(obj,a,rad) | |
156 gs = obj.gs; | |
157 | |
158 for i = 1:length(gs) | |
159 new_gs{i} = gs{i}.rotate(a,rad); | |
160 end | |
161 | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
162 ti = parametrization.Ti(new_gs{:}); |
0 | 163 end |
164 | |
165 function ti = rotate_edges(obj,n); | |
166 new_gs = cell(1,4); | |
167 for i = 0:3 | |
168 new_i = mod(i - n,4); | |
169 new_gs{new_i+1} = obj.gs{i+1}; | |
170 end | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
171 ti = parametrization.Ti(new_gs{:}); |
0 | 172 end |
173 end | |
174 | |
175 methods(Static) | |
176 function obj = points(p1, p2, p3, p4) | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
177 g1 = parametrization.Curve.line(p1,p2); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
178 g2 = parametrization.Curve.line(p2,p3); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
179 g3 = parametrization.Curve.line(p3,p4); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
180 g4 = parametrization.Curve.line(p4,p1); |
0 | 181 |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
182 obj = parametrization.Ti(g1,g2,g3,g4); |
0 | 183 end |
184 | |
544
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
185 function obj = rectangle(a, b) |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
186 p1 = a; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
187 p2 = [b(1), a(2)]; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
188 p3 = b; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
189 p4 = [a(1), b(2)]; |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
190 |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
191 obj = parametrization.Ti.points(p1,p2,p3,p4); |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
192 end |
433ccb5d2f0f
Add Ti parametrization of rectangle
Jonatan Werpers <jonatan@werpers.com>
parents:
332
diff
changeset
|
193 |
332
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
194 % 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
|
195 % 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
|
196 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
|
197 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
|
198 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
|
199 |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
200 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
|
201 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
|
202 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
|
203 else |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
204 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
|
205 end |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
206 end |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
207 |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
208 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
|
209 end |
875386d0b2ff
Fixed a bug in draw and added a helper function to parametrization.Ti.
Jonatan Werpers <jonatan@werpers.com>
parents:
272
diff
changeset
|
210 |
0 | 211 function label(varargin) |
212 if nargin == 2 && ischar(varargin{2}) | |
213 label_impl(varargin{:}); | |
214 else | |
215 for i = 1:length(varargin) | |
216 label_impl(varargin{i},inputname(i)); | |
217 end | |
218 end | |
219 | |
220 | |
221 function label_impl(ti,str) | |
222 S = ti.S; | |
223 | |
224 pc = S(0.5,0.5); | |
225 | |
226 margin = 0.1; | |
227 pw = S( margin, 0.5); | |
228 pe = S(1-margin, 0.5); | |
229 ps = S( 0.5, margin); | |
230 pn = S( 0.5, 1-margin); | |
231 | |
232 | |
233 ti.show(2,2); | |
248
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
234 parametrization.place_label(pc,str); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
235 parametrization.place_label(pw,'w'); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
236 parametrization.place_label(pe,'e'); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
237 parametrization.place_label(ps,'s'); |
81e0ead29431
Fixed package names in +parametrization
Jonatan Werpers <jonatan@werpers.com>
parents:
151
diff
changeset
|
238 parametrization.place_label(pn,'n'); |
0 | 239 end |
240 end | |
241 end | |
242 end |