Mercurial > repos > public > sbplib
comparison +parametrization/Curve.m @ 425:e56dbd9e4196 feature/grids
Merge feature/beams
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 07 Feb 2017 16:09:02 +0100 |
parents | 0fd4b259af9e |
children | 0776fa4754ff |
comparison
equal
deleted
inserted
replaced
423:a2cb0d4f4a02 | 425:e56dbd9e4196 |
---|---|
22 assert(all(size(p_test) == [2,1]), 'A curve parametrization must return a 2x1 vector.'); | 22 assert(all(size(p_test) == [2,1]), 'A curve parametrization must return a 2x1 vector.'); |
23 | 23 |
24 if ~isempty(transformation) | 24 if ~isempty(transformation) |
25 transformation.base_g = g; | 25 transformation.base_g = g; |
26 transformation.base_gp = gp; | 26 transformation.base_gp = gp; |
27 [g,gp] = grid.Curve.transform_g(g,gp,transformation); | 27 [g,gp] = parametrization.Curve.transform_g(g,gp,transformation); |
28 end | 28 end |
29 | 29 |
30 obj.g = g; | 30 obj.g = g; |
31 obj.gp = gp; | 31 obj.gp = gp; |
32 obj.transformation = transformation; | 32 obj.transformation = transformation; |
66 set(h,'Color',Color.red); | 66 set(h,'Color',Color.red); |
67 obj.plot(m); | 67 obj.plot(m); |
68 end | 68 end |
69 | 69 |
70 function h= show(obj,name) | 70 function h= show(obj,name) |
71 default_arg('name', '') | |
71 p = obj.g(1/2); | 72 p = obj.g(1/2); |
72 n = obj.normal(1/2); | 73 n = obj.normal(1/2); |
73 p = p + n*0.1; | 74 p = p + n*0.1; |
74 | 75 |
75 % Add arrow | 76 % Add arrow |
76 | 77 |
77 h = text(p(1),p(2),name); | 78 |
78 h.HorizontalAlignment = 'center'; | 79 if ~isempty(name) |
79 h.VerticalAlignment = 'middle'; | 80 h = text(p(1),p(2),name); |
80 | 81 h.HorizontalAlignment = 'center'; |
81 obj.plot(); | 82 h.VerticalAlignment = 'middle'; |
83 end | |
84 | |
85 h = obj.plot(); | |
82 end | 86 end |
83 % Shows curve with name and arrow for direction. | 87 % Shows curve with name and arrow for direction. |
84 | 88 |
85 % Length of arc from parameter t0 to t1 (which may be vectors). | 89 % Length of arc from parameter t0 to t1 (which may be vectors). |
86 % Computed using derivative. | 90 % Computed using derivative. |
104 arcPar = @(s) tFunc(s*L); | 108 arcPar = @(s) tFunc(s*L); |
105 | 109 |
106 % New function and derivative | 110 % New function and derivative |
107 g_new = @(t)obj.g(arcPar(t)); | 111 g_new = @(t)obj.g(arcPar(t)); |
108 gp_new = @(t) normalize(obj.gp(arcPar(t))); | 112 gp_new = @(t) normalize(obj.gp(arcPar(t))); |
109 curve = grid.Curve(g_new,gp_new); | 113 curve = parametrization.Curve(g_new,gp_new); |
110 | 114 |
111 end | 115 end |
112 | 116 |
113 % how to make it work for methods without returns | 117 % how to make it work for methods without returns |
114 function p = subsref(obj,S) | 118 function p = subsref(obj,S) |
129 | 133 |
130 %% TRANSFORMATION OF A CURVE | 134 %% TRANSFORMATION OF A CURVE |
131 function D = reverse(C) | 135 function D = reverse(C) |
132 % g = C.g; | 136 % g = C.g; |
133 % gp = C.gp; | 137 % gp = C.gp; |
134 % D = grid.Curve(@(t)g(1-t),@(t)-gp(1-t)); | 138 % D = parametrization.Curve(@(t)g(1-t),@(t)-gp(1-t)); |
135 D = C.transform([],[],-1); | 139 D = C.transform([],[],-1); |
136 end | 140 end |
137 | 141 |
138 function D = transform(C,A,b,flip) | 142 function D = transform(C,A,b,flip) |
139 default_arg('A',[1 0; 0 1]); | 143 default_arg('A',[1 0; 0 1]); |
155 transformation.A = A*A_old; | 159 transformation.A = A*A_old; |
156 transformation.b = A*b_old + b; | 160 transformation.b = A*b_old + b; |
157 transformation.flip = flip*flip_old; | 161 transformation.flip = flip*flip_old; |
158 end | 162 end |
159 | 163 |
160 D = grid.Curve(g,gp,transformation); | 164 D = parametrization.Curve(g,gp,transformation); |
161 | 165 |
162 end | 166 end |
163 | 167 |
164 function D = translate(C,a) | 168 function D = translate(C,a) |
165 g = C.g; | 169 g = C.g; |
169 % x = g(t); | 173 % x = g(t); |
170 % v(1,:) = x(1,:)+a(1); | 174 % v(1,:) = x(1,:)+a(1); |
171 % v(2,:) = x(2,:)+a(2); | 175 % v(2,:) = x(2,:)+a(2); |
172 % end | 176 % end |
173 | 177 |
174 % D = grid.Curve(@g_fun,gp); | 178 % D = parametrization.Curve(@g_fun,gp); |
175 | 179 |
176 D = C.transform([],a); | 180 D = C.transform([],a); |
177 end | 181 end |
178 | 182 |
179 function D = mirror(C, a, b) | 183 function D = mirror(C, a, b) |
204 | 208 |
205 % function v = gp_fun(t) | 209 % function v = gp_fun(t) |
206 % v = A*gp(t); | 210 % v = A*gp(t); |
207 % end | 211 % end |
208 | 212 |
209 % D = grid.Curve(@g_fun,@gp_fun); | 213 % D = parametrization.Curve(@g_fun,@gp_fun); |
210 | 214 |
211 % g = A(g-a)+a = Ag - Aa + a; | 215 % g = A(g-a)+a = Ag - Aa + a; |
212 b = - A*a + a; | 216 b = - A*a + a; |
213 D = C.transform(A,b); | 217 D = C.transform(A,b); |
214 | 218 |
235 | 239 |
236 % function v = gp_fun(t) | 240 % function v = gp_fun(t) |
237 % v = A*gp(t); | 241 % v = A*gp(t); |
238 % end | 242 % end |
239 | 243 |
240 % D = grid.Curve(@g_fun,@gp_fun); | 244 % D = parametrization.Curve(@g_fun,@gp_fun); |
241 | 245 |
242 | 246 |
243 % g = A(g-a)+a = Ag - Aa + a; | 247 % g = A(g-a)+a = Ag - Aa + a; |
244 b = - A*a + a; | 248 b = - A*a + a; |
245 D = C.transform(A,b); | 249 D = C.transform(A,b); |
264 | 268 |
265 function v = g_fun(t) | 269 function v = g_fun(t) |
266 v(1,:) = p1(1) + t.*(p2(1)-p1(1)); | 270 v(1,:) = p1(1) + t.*(p2(1)-p1(1)); |
267 v(2,:) = p1(2) + t.*(p2(2)-p1(2)); | 271 v(2,:) = p1(2) + t.*(p2(2)-p1(2)); |
268 end | 272 end |
269 g = @g_fun; | 273 |
270 | 274 function v = g_fun_deriv(t) |
271 obj = grid.Curve(g); | 275 v(1,:) = t.*0 + (p2(1)-p1(1)); |
276 v(2,:) = t.*0 + (p2(2)-p1(2)); | |
277 end | |
278 | |
279 obj = parametrization.Curve(@g_fun, @g_fun_deriv); | |
272 end | 280 end |
273 | 281 |
274 function obj = circle(c,r,phi) | 282 function obj = circle(c,r,phi) |
275 default_arg('phi',[0; 2*pi]) | 283 default_arg('phi',[0; 2*pi]) |
276 default_arg('c',[0; 0]) | 284 default_arg('c',[0; 0]) |
286 w = phi(1)+t*(phi(2)-phi(1)); | 294 w = phi(1)+t*(phi(2)-phi(1)); |
287 v(1,:) = -(phi(2)-phi(1))*r*sin(w); | 295 v(1,:) = -(phi(2)-phi(1))*r*sin(w); |
288 v(2,:) = (phi(2)-phi(1))*r*cos(w); | 296 v(2,:) = (phi(2)-phi(1))*r*cos(w); |
289 end | 297 end |
290 | 298 |
291 obj = grid.Curve(@g_fun,@g_fun_deriv); | 299 obj = parametrization.Curve(@g_fun,@g_fun_deriv); |
292 end | 300 end |
293 | 301 |
294 function obj = bezier(p0, p1, p2, p3) | 302 function obj = bezier(p0, p1, p2, p3) |
295 function v = g_fun(t) | 303 function v = g_fun(t) |
296 v(1,:) = (1-t).^3*p0(1) + 3*(1-t).^2.*t*p1(1) + 3*(1-t).*t.^2*p2(1) + t.^3*p3(1); | 304 v(1,:) = (1-t).^3*p0(1) + 3*(1-t).^2.*t*p1(1) + 3*(1-t).*t.^2*p2(1) + t.^3*p3(1); |
300 function v = g_fun_deriv(t) | 308 function v = g_fun_deriv(t) |
301 v(1,:) = 3*(1-t).^2*(p1(1)-p0(1)) + 6*(1-t).*t*(p2(1)-p1(1)) + 3*t.^2*(p3(1)-p2(1)); | 309 v(1,:) = 3*(1-t).^2*(p1(1)-p0(1)) + 6*(1-t).*t*(p2(1)-p1(1)) + 3*t.^2*(p3(1)-p2(1)); |
302 v(2,:) = 3*(1-t).^2*(p1(2)-p0(2)) + 6*(1-t).*t*(p2(2)-p1(2)) + 3*t.^2*(p3(2)-p2(2)); | 310 v(2,:) = 3*(1-t).^2*(p1(2)-p0(2)) + 6*(1-t).*t*(p2(2)-p1(2)) + 3*t.^2*(p3(2)-p2(2)); |
303 end | 311 end |
304 | 312 |
305 obj = grid.Curve(@g_fun,@g_fun_deriv); | 313 obj = parametrization.Curve(@g_fun,@g_fun_deriv); |
306 end | 314 end |
307 | 315 |
308 | 316 |
309 function [g_out,gp_out] = transform_g(g,gp,tr) | 317 function [g_out,gp_out] = transform_g(g,gp,tr) |
310 A = tr.A; | 318 A = tr.A; |