Matrice de rotation => changement de repere

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

matrice de rotation => changement de repere

par felben86 » 19 Avr 2006, 10:18

Bonjour a tous,
voila c'est ma premiere visite sur ce forum, je viens de m'inscrir à l'instant....
Je suis programmeur en stage (IUT) et j'ai un truc à faire:

J'ai un ensemble de points dans un espace, qui possède donc les coordonnées (x,y,z) et j'ai un plan caractérisé par un point et un vecteur normal que j'ai calculé.
Le but est d'afficher ces point dans un environnement 2D dont le repere est le pan.

Premier reflexe : Pythagore, mais vite abandoné car quand x ou y est negatif alors c'est pas bon et puis ca marche que pour des repere orthogonnaux à un axe.

Je me suis renseigner et c'est les matrice de rotation qu'il me faut, j'ai trouvé comment les calculer avec cosinus sinus mais vu que j'ai un vecteur normal je bloque.

QUESTIONS :
Comment a partir d'un vecteur normal du plan quelquonque je retrouve les incnnu de cos(alpha) = coté adj/hyp.
Comment marche les matrices de rotation : j'en fait 3, une par axe, et je fait quoi avec? je les agence comment avec mes cordonnées pour trouver les nouvelles?

Voila, donc toutes infos et bon a prendre pour moi car même si j'aime pas ca, je meilleur en programmation qu'en math sauf programme de Lycée (fct exp et tourt le toutim) qui pour moi est du gateau....



abel
Membre Relatif
Messages: 258
Enregistré le: 17 Mar 2006, 19:59

par abel » 19 Avr 2006, 10:29

En fait tu veux projeter orthogonalement tes points sur ton plan ??? ou simplement faire un changement de base ???

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 19 Avr 2006, 10:36

Oui, j'ai dut mal m'exprimer, c'est ca, je veut les afficher orthogonalement au plan, donc meme sens, direction opposée au vecteur normal je pense.
Mais pour ca je doit faire un changement de base non?

Je veut faire une fonction qui : quand je lui donne un point(x,y,z) + un plan(veteur normal+point du plan), elle me retourne un nouveau point(x,y) qui correspond a ses coordonnées quand le repere est le plan.

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 19 Avr 2006, 11:06

ah aussi pour infos, tout les points sont selectionné et se trouvent SUR l plan, si ca peut aider...moi je trouve rien la

abel
Membre Relatif
Messages: 258
Enregistré le: 17 Mar 2006, 19:59

par abel » 19 Avr 2006, 11:07

- Déjà il faut que tu crées une base de ton plan pr trouver des coordonnées car il en existe une infinité, prends une base orthonormée directe : pour cela, prends un vecteur (nimporte lequel) orthogonal au vecteur normal (faire en sorte que leur produit scalaire soit nul) puis, norme le (c à d divise chq coordonée par sqrt(x²+y²+z²)), ensuite prends comme autre vecteur le produit vectoriel des 2 autres (le normal et le celui que tu viens de fabriquer). Ainsi on a une nouvelle base de l'espace (f1,f2,f3) (on notera e1,e2,e3 pr l'ancienne base). Avec f1, la normale au plan (il faut aussi normer f1). Ensuite il faut changer d'origine : il suffit de prendre le point A(a,b,c) qu'on t'a donné pr nouvelle origine.
- Pour projeter un point X(x,y,z) : il faut retrancher (a,b,c) à (x,y,z) (pr prendre en compte le décallage du au changement d'origine) puis mettre ses coordonnées dans la nouvelle base : X=P*X' (où P est la matrice de passage entre e et f (qui est une matrice de rotation), pr faire cette matrice il suffit d'écrire en collone les coordonnées des fi en fonction des ei) donc du coup X'=Q*X (où Q est l'inverse de P qui correspond à la matrice de passage entre les bases f et e qui est aussi la transposée de P).
Mainteant qu'on a les X', il suffit pr projeter de mettre 0 à la 1ere cordonnée de garder les autres coordonnées telle quelle. Maintenant on a les coordonées des projetés dans la nouvelle base. Pr se remettre dans la base de départ, il suffit de faire X=P*X' puis d'ajouter (a,b,c) aux coordonnées ainsi obtenues.


PS : je viens de voir ton dernier post : si tes points sont sur le plan, le travail est déjà fait, il sont leur propre projeté !!! dans ce cas il suffit de faire un changement de repere (celui que j'ai proposé convient)) : il suffira de renvoyer les 2 dernieres coordonnées car la 1ere sera nulle.

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 19 Avr 2006, 11:28

euh, ouais bon je t'avouerais que je suis un peu larguer...
pourquoi mettre tous les Fi dans la martrice de passage, ca fait qu'on aura F1 qui est le vecteur normal...ca me parait bizarre.
je pensais que je devait me taper des cosisus sinus, et la j'en voit pas...
Je suis vraiment naze en matrice, proba, binamiale.... donc vas y doucement stp.

Deja la je vais apprendre a calculer un vecteur orthogonal je te remercie.

abel
Membre Relatif
Messages: 258
Enregistré le: 17 Mar 2006, 19:59

par abel » 19 Avr 2006, 11:39

Une matrice de rotation n'est pas forcement de la forme que tu dis (avc les cos et sin) car elle l'est que dans une certaine base qui est bien adaptée (une base qui contiendra l'axe de rotation) mais pas dans toutes les bases. Une matrice est dite de rotation si son det vaut +1 et qu'elle conserve la norme ou de maniere equivalente, si ces collones sont orthogonale 2à2.
- Ma démarche était de fabriquer une nouvelle base orthonormée directe contenant la normale au plan (comme ca pr projeter sur le plan il suffira de mettre 0 à la composante f1 (car on projette parallemenent à f1)).
- En fait j'avais mal compris ton pb car je n'avais pas vu ton dernier post, apparement on te demande juste de fabriquer une base du plan et d'exprimer les coordonnées de points : dans ce cas il suffit de prendre 2 vecteurs orthogonaux à f1 de la maniere que j'ai décrite comme ça ta nouvelle base est orth et directe du "1er coup" (ce qui evite de passer par l'orthonormalisation de schmidt). Apres c'est du matriciel, il suffit de creer tes 2 matrices de passage sans oublier d'integrer le décalage du à l'origine) et grace à cela tu pourras tres simplement passer d'une base à l'autre (dans la nouvelle base (f1 f2 f3), la coordonées f1 vaut tjs 0 pour les points sur le plan).

PS : pr trouver un vecteur orthogonal à un autre rien de + simple, il faut faire en sorte que leur produit scalaire soit nul ex : pour (1,2,3) il suffit de prendre (1,-1/2,0).

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 19 Avr 2006, 11:57

Oui mes point sont sur le plan c'est a dire que j'ai ax + by + cz - d = 0

Tu me dit qu'il suffit de creer deux matrices de passage, mais ca doit etre des matrice de rotation? et donc je doit en avoir 3 , une par axe...
Ou alors tu veut dire une matrice de translation (point de mon plan) + une matrice de rotation(je la fait comment celle la)

abel
Membre Relatif
Messages: 258
Enregistré le: 17 Mar 2006, 19:59

par abel » 19 Avr 2006, 12:09

Une matrice de passage entre 2 BOND (Base ON, Directe) est une matrice de rotation (cependant si tu veux integrer une translation en plus, on parle de vissage). Il suffit d'en creer une seule : elle permet de passer d'une base à une autre. La 2eme matrice de passage est la matrice inverse de la premiere (elle permet de se remettre dans l'ancienne base).
Attention, une matrice permet seulement de changer de base et non de repere, le changement d'origine doit se faire avant le changement de base (dans notre cas). Le changement de base et d'origine se traitent l'un apres l'autre et non en meme tps car il ne faut pas confondre point et vecteur.

Pour creer ta matrice de rotation, il suffit d'ecrire les coordonnées de tes nouveux vecteurs (f1,f2,f3) en collone dans la base e1,e2,e3. ex :
f1(1,2,3)
f2(0,2,7)
f3(1,0,8)

ta matrice de passage sera :
1 0 1
2 2 0
3 7 8

Ici elle nest pas de rotation car g pris des vecteurs au pif.
apres il suffit de l'inverser pr avoir les coordonnées des ei en fonction des fi

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 19 Avr 2006, 14:36

Je ne sais pas si tu ti connais en prog mais j'ai vu que tu a parler de sqrt tt a l'heure donc ptet que oui tu en fait un peu:

Voila ce que j'ai fait

public Matrix3d makeRotZ(Plane3D plane)
{ double hyp = Math.sqrt( (plane.getU().x*plane.getU().x) +(plane.getU().z*plane.getU().z));
double cosA = plane.getU().x / hyp;
double sinA = plane.getU().z / hyp;
return new Matrix3d(cosA, -sinA, 0, sinA, cosA, 0, 0,0,1);
}


apres ca pour obtenir un point je fait:

public void addPoint(double px, double py, double pz, int i)
{ double y = py*rotZ.m10 + py*rotZ.m11 + py*rotZ.m12;
double z = pz*rotZ.m20 + pz*rotZ.m21 + pz*rotZ.m22;
myGraph.addPoint(z,y, i);
}
mais seulement si le seul axe de rotation est Z d'ailleurs ici, (double z = pz*rotZ.m20 + pz*rotZ.m21 + pz*rotZ.m22;) ne sert a rien.

Quest ce que tu en pense, je suis loin du compte?
Sinon, pour les autre rotation, j'ai juste à creer les autre matrice(deja fait), et a faire rentrer le resultat de la premiere dans la seconde, puis seconde troisieme...

abel
Membre Relatif
Messages: 258
Enregistré le: 17 Mar 2006, 19:59

par abel » 19 Avr 2006, 15:17

Euhh...disons que je connais un peu le maple et un peu le C++ mais bon...un petit peu quoi...
Il est censé faire quoi ton prog ??? fabriquer la matrice qui donneras la relations entre les différentes bases ??? Je comprend pas pkoi tu veux en fabriquer 3 matrices, une seule suffit pr caractériser entierement une nouvelle base si on connais la base de départ...explique moi ce que tu veux faire avc ton prog...
Si tu veux je peux te donner le programme en maple si c pas trop long à faire (car je suis en pleine révisions, g les concours lundi)

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 19 Avr 2006, 15:40

bah moi mon prog il à ca:
- j'ai plein de points dans l'espace, et plein de plans lol
- je prend un plan, et il me donne tout les point qui sont dessus enfin sur le plan.
- Ca c'est fait
- maintenant les point faut les afficher sur un repere 2D, donc ca c'est a moitié fait car je peut les projeté sur les reperes (Oij) ou (Ojk) par exemple en prenant a chaque fois que deux coordonnées des points (xy) ou (yz) par exemple...
- Ca c'est fait

Maintenant faut que ce ne soit pas un projété mais un vu orthogonale au plan (qui est la coupe du modèle) pour bien se rendre conte des distance sur la surface du plan.
Ca c'est pas fait

Il me faut donc une methode qui quand je lui donne un point3D (xyz) elle m'en renvoi un point2D (x', y') que je met a afficher dans un fenetre.
Ces coordonnées (x', y') caractérise le point dans le nouveau repere fait par le plan.
Tu vois, faut que d'une vue en 3D, j'ouvre une autre fenetre ou apparait la vue 2D vu d'une camera qui se situe sur le vecteur normal du plan en gros koi.
Pour ca ben apparement me faut des matrices, au autre chose, je m'en fou moi, j'ecrit la formule et l'ordi se demerde lol....

Nan mais atend, je vais pas te bouffer ton temps, en plus si ca se trouve je vais rien comprendre au prog. Mais merci de l'aide, revise je veut pas de gacher tes partielles lol..

abel
Membre Relatif
Messages: 258
Enregistré le: 17 Mar 2006, 19:59

par abel » 19 Avr 2006, 16:20

Non mais ca me fait un peu reviser l'algebre linéaire.
En fait c'est bien ça, il faut un programme qui permette de calculer les coordonnées du projeté orthogonal sur le plan d'un point.
Le premier pb c'est qu'une base OND n'est pas unique dans un plan, il en existe une infinité sans compter le fait qu'on peut aussi fixer arbitrairement l'origine...déjà il faut que tu choisisses ta base de ton plan à partir de ton vecteur normal par la methode que j'ai exposé par exemple, tu peux utiliser le PC pr qu'il te trouve les vecteurs. Ensuite il faut creer une matrice comportant les coordonnées des fi en fonction des ei (j'en ai parlé), l'inverser (ce qui revient à la transposer) (on la notera Q)...ensuite pr avoir tes coordonnées dans le plan, tu prends les coordonnées (x,y,z), tu retranches (a,b,c) (les coordonnées de l'origine que tu auras arbitrairement choisi sur le plan) ensuite on aura X'=(x',y',z')=Q*(x-a,y-b,z-c) (la multiplicatoin par Q a pr effet de faire une rotation de la base selon un axe a priori inconnu d'un angle inconnu mais ca n'a aucune importance : la base "tourne" de sorte à "caler" e1 sur f1 en qques sortes...)....ici on a les coordonnées du point dans l'espace dans notre nouveau repère, maintenant pour projeter sur le plan, il suffit de remplacer la 1ere coordonnée par 0 d'où : (0,y',z') sont les coordonnées du projeté recherché... donc tes points que ton programme doit afficher sont les (y',z').

PS : tu constatera que dans le nouveau repere le plan aura pr equation x'=0 c'est pourquoi il est interessant de changer de base, on se ramene a des equatoins triviales et donc faire une projection devient triviale dans une bonne base.

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 19 Avr 2006, 16:39

ouais je te remercie beaucoup, c'est ce que j'avait un peu compris mais pas trop. La ca va, mais :
dans la pluspart des site, il dise de faire 3 matrice de rotation (1 par axe) et il montre comment les avoir, mais la dans 1 matrice je ne vois pas comment m'y prendre pour mettre les fi en fonction de ei:

abel
Membre Relatif
Messages: 258
Enregistré le: 17 Mar 2006, 19:59

par abel » 19 Avr 2006, 16:56

déjà il faut creer ta base f1,f2,f3 de sorte qu'elle soit OND(tu auras par exemple f1=2*e1+3*e3, f2=e2+9*e3, f3=e2+e3) donc ta matrice de passage entre ces 2 bases sera la matrice : (ici f1,f2,f3 n'est pas une BOND car g pris des valeurs au pif)
2 0 0
0 1 1
3 9 1
ensuite tu l'inverses (dans le cas de matrice de passage entre 2 bases ON inverser revient à transposer (ce qui + simple niveau complexité)) ce qui donne la matrice Q. Apres, tu obtiens les nouvelles coordonnées en retranchant celle de l'origine puis en multipliant par Q et dans cette nouvelle base, projeter un vecteur (donc un point en choisissant l'origine sur le plan) reviens à mettre 0 à la place de la composante f1 c à d qu'une fois les calculs de base terminés, il te reste qu'à remplacer une coordonnée ce qui est certainement rapide à faire pr un ordi...
Apres moi je vois ça comme un "algebriste" donc peut etre que pr le pc, il y a d'autres contraintes mais ce n'est pas mon domaine donc bon...je peux pas trop anticiper.

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 19 Avr 2006, 17:05

abel a écrit:déjà il faut creer ta base f1,f2,f3 de sorte qu'elle soit OND(tu auras par exemple f1=2*e1+3*e3, f2=e2+9*e3, f3=e2+e3) donc ta matrice de passage entre ces 2 bases sera la matrice : (ici f1,f2,f3 n'est pas une BOND car g pris des valeurs au pif)
2 0 0
0 1 1
3 9 1


C'est justement ca que je ne sais pas faire, le reste tu me la deja dit, c'est super, j'aurais plus qu'a suivre apres.
mais comment je creer ma base la

abel
Membre Relatif
Messages: 258
Enregistré le: 17 Mar 2006, 19:59

par abel » 19 Avr 2006, 17:18

soit N le vecteur normal au plan :
- on pose f1=N/||N||
- f2' est tel que = 0 autrement dit il te suffit de choisir un vecteur qui vérifie l'equation du plan sans la constante (car N est orthogonal a tout vecteur du plan) : ax+by+cz=0 : exemple le vecteur de coordonnée
f2' = (0,1,-b/c) convient...apres il faut le normer d'où : f2=f'2/||f'2||
- ensuite pour f3 tu poses f3=f1 (vect) f2 (où vect désigne le produit vectoriel de 2 vecteurs qui a pour propriété d'etre orthogonal aux 2 vecteurs qu'on "multiplie" dont la norme vaut 1 dans le cas de 2 vecteurs orthogonaux de norme=1 donc f3 est déjà normé)
- voilà maintenant tu disposes de ta nouvelle base, apres il te reste plus qu'à choisir une origine arbitrairement (qui doit qud meme appartenir au plan car les matrices ne permettent pas de gérer les structures affines donc on se ramène à du linéaire pr pouvoir "confondre" point et vecteur)

EDIT : il est + judicieux de prendre le vecteur f'2=(-2bc,ac,ab) car il se peut que dans ton equation on ait c=0 voire b=0 donc division par 0 ---> bof. Si malgré cela tu as f'2=(0,0,0) cela veut dire que ta base est bonne modulo un echange de vecteur (changer f1 en f2 ou en f3 etc...) car cela veut dire que le plan avait pr equation : x=d ou y=d ou z=d......echanger un vecteur aura pr effet d'avoir x=d au lieu de y=d par exemple puis il reste juste a changer l'origine (pas besoin de passer par la matrice).

EDIT2 : Le fait de permuter 2 vecteur fera que ta base sera indirecte donc pr rectifier le tir il faudra procéder à 2 permutations : celle qui nous interesse pr avoir la bonne equation, puis echanger les 2 autres vecteurs entre eux juste pr garder le caractère direct (mais bon ça c'est un réglage final).

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 19 Avr 2006, 17:43

Ah merde ok, ben la chui trop bloqué : je peut pas demandé a mon pc de resourdre une eqation(pour trouvé un vecteur orthogonal), je m erenseigne cesoir, et reviens demain je pense.

En tout cas merci pour tout, tu m'a vachement bien aider, j'y vois plus clair maintenant

abel
Membre Relatif
Messages: 258
Enregistré le: 17 Mar 2006, 19:59

par abel » 19 Avr 2006, 17:49

Mais y a rien à resoudre, on sait que N=(a,b,c) donc on prend f2'=(-2bc,ac,ab) puis on fait un produit vectoriel pour avoir f3 (sans oublier de normer)

felben86
Membre Naturel
Messages: 11
Enregistré le: 19 Avr 2006, 10:04

par felben86 » 24 Avr 2006, 18:03

resalut abel, desolé de pas avoir rep avant, j'ai trouvé l lien qu'il me fallait:
http://jeux.developpez.com/faq/matquat/?page=transformations#Q26

jette y un oiel mais chez moi ca ne marche pas.
Je me suis alors mis d'accord avec mon tuteur de ne faire qu'une rotation en Y car les plan sont orthogonaux a cet axes, et ca marche avec translation puis rotation, mais je crois que l'inverse marche aussi.

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 29 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite