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
|
|
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 |