Switch to unified view

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