|
a |
|
b/tests/MFD_tests/Wrapping2.m |
|
|
1 |
% Trova le tangenti ai punti dati spostandoli in un riferimento col centro |
|
|
2 |
% della crf al centro degli assi. Quando non c'e' wrapping calcola la |
|
|
3 |
% distanza cmq tra i punti e mette come tangenti i punti iniziali. Infine |
|
|
4 |
% se i punti sono sulla crf non usa ottimizzazione ma identifica tangente |
|
|
5 |
% col punto. |
|
|
6 |
% lato = 1;% 1 dx o sotto---- -1 sx o sopra |
|
|
7 |
% problematico GA perche' sulla crf |
|
|
8 |
function [L,T1_glob,T2_glob,contact] = Wrapping2(centro_glob,R,P1,P2,lato,graphics) |
|
|
9 |
|
|
|
10 |
% lavoro sempre con circonferenza al centro degli assi: l'algoritmo č pių |
|
|
11 |
% preciso. |
|
|
12 |
v1 = P1-centro_glob; |
|
|
13 |
v2 = P2-centro_glob; |
|
|
14 |
|
|
|
15 |
dist_P = v2-v1; |
|
|
16 |
if cross([1 0 0 ],[v1/norm(v1) 0])>0 == [0 0 1] |
|
|
17 |
% display('P1 sopra la circonferenza') |
|
|
18 |
else |
|
|
19 |
% display('P1 sotto la circonferenza') |
|
|
20 |
lato = lato*-1; |
|
|
21 |
end |
|
|
22 |
if cross([1 0 0 ],[v2/norm(v2) 0])<0 == [0 0 1] |
|
|
23 |
% display('P2 sotto la circonferenza') |
|
|
24 |
else |
|
|
25 |
% display('P2 sopra la circonferenza') |
|
|
26 |
end |
|
|
27 |
|
|
|
28 |
if cross([1 0 0 ],[v1/norm(v1) 0])>0 == [0 0 1] & cross([1 0 0 ],[v2/norm(v2) 0])>0 == [0 0 1] |
|
|
29 |
% display('P1 e P2 sopra la circonferenza') |
|
|
30 |
lato = lato*-1; |
|
|
31 |
end |
|
|
32 |
%direzione: se P1 è sopra P2: |
|
|
33 |
%-----> lato = 1 wrapping a dx |
|
|
34 |
%-----> lato = -1 wrapping a sx |
|
|
35 |
% se P1 e sotto P2 è il contrario |
|
|
36 |
|
|
|
37 |
%stima della distanza tra centro e vettore che unisce i punti (limit |
|
|
38 |
%condition) |
|
|
39 |
h = cross([-lato*v1,0],[dist_P,0]/norm([dist_P,0])); |
|
|
40 |
|
|
|
41 |
if h(3)>R |
|
|
42 |
% display(' '),display('NO WRAPPING!!!'),display(' ') |
|
|
43 |
L = norm([dist_P,0]); |
|
|
44 |
contact = 0; |
|
|
45 |
T1_glob = P1; |
|
|
46 |
T2_glob = P2; |
|
|
47 |
if strcmp(graphics,'on') == 1 |
|
|
48 |
%grafica normalizzata |
|
|
49 |
% plot(v1(1), v1(2),'o'),plot(v2(1), v2(2),'o') |
|
|
50 |
% plot([v1(1),v2(1)], [v1(2),v2(2)],'g') |
|
|
51 |
%grafica globale |
|
|
52 |
t = 0:(2*pi)/300:2*pi; |
|
|
53 |
CRF = [R*cos(t'), R*sin(t')]; |
|
|
54 |
plot(centro_glob(:,1)+CRF(:,1), centro_glob(:,2)+CRF(:,2),'k'),hold on |
|
|
55 |
plot([P1(1),P2(1)], [P1(2),P2(2)],'k') |
|
|
56 |
plot(P1(1), P1(2),'o','MarkerEdgeColor','k','MarkerFaceColor','w'); |
|
|
57 |
plot(P2(1), P2(2),'o','MarkerEdgeColor','k','MarkerFaceColor','w') |
|
|
58 |
|
|
|
59 |
end |
|
|
60 |
return |
|
|
61 |
else |
|
|
62 |
% display(' '),display('WRAP!!!'),display(' ') |
|
|
63 |
contact = 1; |
|
|
64 |
end |
|
|
65 |
|
|
|
66 |
%% algorithm |
|
|
67 |
% pos punto tangenza + vettore tangente = pos_punto est |
|
|
68 |
%% tangente nel verso delle theta positive se lato = 1 |
|
|
69 |
% l'algoritmo chiude OT1P1 in pratica |
|
|
70 |
dist1 = sqrt(norm(v1)^2-R^2); |
|
|
71 |
|
|
|
72 |
fun_min1= @(x) R*[cos(x) sin(x)]+lato*dist1*[-sin(x) cos(x)]-v1; |
|
|
73 |
options1=optimset('TolFun',10e-13,'TolX',10e-11); |
|
|
74 |
|
|
|
75 |
x0 = pi/4; |
|
|
76 |
[sol1,fval,exitflag] = fsolve(fun_min1,x0,options1); |
|
|
77 |
% retry with new initial point |
|
|
78 |
if exitflag == -2 |
|
|
79 |
x0 = sol1; |
|
|
80 |
[sol1,fval,exitflag] = fsolve(fun_min1,x0,options1); |
|
|
81 |
end |
|
|
82 |
% if no solution then it doesn't work |
|
|
83 |
if exitflag == -2 |
|
|
84 |
display('La tangente superiore non converge!!!') |
|
|
85 |
waitforbuttonpress |
|
|
86 |
end |
|
|
87 |
T1 = [R*cos(sol1), R*sin(sol1)]; |
|
|
88 |
if(dist1<10e-6) |
|
|
89 |
T1 = v1; |
|
|
90 |
% display('PUNTO SULLA CRF'); |
|
|
91 |
% waitforbuttonpress |
|
|
92 |
end |
|
|
93 |
%% tangente nel verso opposto al precedente |
|
|
94 |
% l'algoritmo chiude OT1P2 in pratica |
|
|
95 |
%tangente nel verso delle theta negative |
|
|
96 |
dist2 = sqrt(norm(v2)^2-R^2); |
|
|
97 |
fun_min2= @(x) R*[cos(x) sin(x)]-lato*dist2*[-sin(x) cos(x)]-v2; |
|
|
98 |
x0 = -pi/4; |
|
|
99 |
options2=optimset('TolFun',10e-11,'TolX',10e-11); |
|
|
100 |
[sol2,fval2,exitflag2] = fsolve(fun_min2,x0,options2); |
|
|
101 |
% retry with new initial point |
|
|
102 |
if exitflag2 == -2 |
|
|
103 |
x0 = sol+20/180*pi; |
|
|
104 |
[sol2,fval2,exitflag2] = fsolve(fun_min2,x0,options2); |
|
|
105 |
end |
|
|
106 |
% if no solution then it doesn't work |
|
|
107 |
if exitflag2 == -2 |
|
|
108 |
display('La tangente inferiore non converge!!!') |
|
|
109 |
waitforbuttonpress |
|
|
110 |
end |
|
|
111 |
T2 = [R*cos(sol2), R*sin(sol2)]; |
|
|
112 |
if(dist2<10e-6) |
|
|
113 |
T2 = v2; |
|
|
114 |
% display('PUNTO SULLA CRF'); |
|
|
115 |
% waitforbuttonpress |
|
|
116 |
end |
|
|
117 |
%% length mi fido |
|
|
118 |
% arco (archi minori di 180) |
|
|
119 |
L_arch = R*asin(norm(cross([T1/R,0], [T2/R,0]))); |
|
|
120 |
|
|
|
121 |
if L_arch<0 |
|
|
122 |
display('ARCO DI WRAPPING MINORE DI ZERO: FORSE WRAPPING NON CORRETTO?') |
|
|
123 |
waitforbuttonpress |
|
|
124 |
end |
|
|
125 |
%dist lineare |
|
|
126 |
Lin_vect1 = (v1-T1); L1 = hypot(Lin_vect1(:,1),Lin_vect1(:,2)); |
|
|
127 |
Lin_vect2 = (v2-T2); L2 = hypot(Lin_vect2(:,1),Lin_vect2(:,2)); |
|
|
128 |
%controllato GA e' affidabile nel wrapping |
|
|
129 |
% L1 |
|
|
130 |
% L2 |
|
|
131 |
% L_arch |
|
|
132 |
% waitforbuttonpress |
|
|
133 |
|
|
|
134 |
L = L1+L2+L_arch; |
|
|
135 |
|
|
|
136 |
%% points in global coordinates |
|
|
137 |
T1_glob = T1+centro_glob; |
|
|
138 |
T2_glob = T2+centro_glob; |
|
|
139 |
% local graphics of the wrapping in normalized coordinates |
|
|
140 |
%% grafica punti base |
|
|
141 |
|
|
|
142 |
if strcmp(graphics,'on') == 1 |
|
|
143 |
%% grafica normalizzata (no casi di no wrapping) |
|
|
144 |
% t = 0:(2*pi)/300:2*pi; |
|
|
145 |
% CRF = [R*cos(t'), R*sin(t')]; |
|
|
146 |
% line(CRF(:,1), CRF(:,2)),hold on |
|
|
147 |
% % punti esterni |
|
|
148 |
% plot(v1(1), v1(2),'o'),plot(v2(1), v2(2),'o') |
|
|
149 |
% axis equal |
|
|
150 |
% % tangenti |
|
|
151 |
% plot([v1(1),T1(1)], [v1(2),T1(2)],'r') |
|
|
152 |
% plot([v2(1),T2(1)], [v2(2),T2(2)]) |
|
|
153 |
%% grafica globale (no casi di no wrapping) |
|
|
154 |
|
|
|
155 |
t = 0:(2*pi)/300:2*pi; |
|
|
156 |
CRF = [R*cos(t'), R*sin(t')]; |
|
|
157 |
plot(centro_glob(:,1)+CRF(:,1), centro_glob(:,2)+CRF(:,2),'k'),hold on |
|
|
158 |
% punti esterni |
|
|
159 |
|
|
|
160 |
|
|
|
161 |
% tangenti |
|
|
162 |
plot([P1(1),T1_glob(1)], [P1(2),T1_glob(2)],'k'); |
|
|
163 |
plot([P2(1),T2_glob(1)], [P2(2),T2_glob(2)],'k'); |
|
|
164 |
plot(P1(1), P1(2),'o','MarkerEdgeColor','k','MarkerFaceColor','w'); |
|
|
165 |
plot(P2(1), P2(2),'o','MarkerEdgeColor','k','MarkerFaceColor','w'); |
|
|
166 |
axis equal |
|
|
167 |
end |
|
|
168 |
clc |