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
0 commit comments