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