Bonjour à tous,
Mon problème n'est pas compliqué à comprendre, je vous explique :
J'ai trois points dans l'espace qui forment donc deux vecteurs ayant un point commun (le deuxième en l'occurrence). Je souhaite calculer une matrice de rotation qui me permette de passer de l'un à l'autre. De calculer les angles alpha, beta et gamma et bien évidemment de vérifier que ça marche en appliquant la matrice de rotation au premier vecteur pour bien retrouver le second ! Ooula je n'ai peut-être pas été si clair que ça..
Je vous joints le script, qui ne marche pas...
Je vous joints aussi la fonction, mais je suis à 99% sûr qu'il n'y a pas d'erreur dedans !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 x=[0 1 4]; y=[0 1 2]; z=[0 1 1]; Tx = x(3)-x(2); Ty = y(3)-y(2); Tz = z(3)-z(2); T = sqrt(Tx^2+Ty^2+Tz^2); A=[x(3) y(3) z(3)]'*[x(2) y(2) z(2)]; base = 'ZYX'; beta = atan2( -A(3,1) , sqrt(A(3,2)^2 + A(3,3)^2) ) alpha = atan2( A(3,2)/cos(beta) , A(3,3)/cos(beta) ) gamma = atan2( A(2,1)/cos(beta) , A(1,1)/cos(beta) ) R=R(alpha,beta,gamma,base) V=T*R(:,2)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 function R=R(a,b,c,base) cosd=@(x) cos(x/180*pi); sind=@(x) sin(x/180*pi); Rx=[1, 0, 0; 0, cosd(a), -sind(a); 0, sind(a), cosd(a)]; Ry=[cosd(b), 0, sind(b); 0, 1, 0; -sind(b), 0, cosd(b)]; Rz=[cosd(c), -sind(c), 0; sind(c), cosd(c), 0; 0, 0, 1]; switch base case {'XZY'} R=Rx*Rz*Ry; case {'XYZ'} R=Rx*Ry*Rz; case {'YXZ'} R=Ry*Rx*Rz; case {'YZX'} R=Ry*Rz*Rx; case {'ZYX'} R=Rz*Ry*Rx; case {'ZXY'} R=Rz*Rx*Ry; end Vous l'aurez donc compris, c'est un problème de maths... enfin je crois Merci d'avance.
Partager