Projection vecteur sur plan

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
Vicolaships
Messages: 2
Enregistré le: 27 Fév 2014, 17:21

Projection vecteur sur plan

par Vicolaships » 27 Fév 2014, 17:27

Salut,

Je cherche à déterminer parmi 3 vecteurs lequel est le plus "vertical" par rapport a un plan.
Dit autrement, je cherche quel vecteur est le plus "proche" de la normale au plan.

Mon plan est défini par ax+by+cz+d=0 et mes vecteurs par (x,y,z).

Je pensais donc projeter les 3 vecteurs sur le plan (selon la direction de la normale au plan) et calculer la norme des 3 vecteurs.
Le vecteur projeté ayant la plus petite norme sera alors le plus "vertical" par rapport au plan.

Est-ce vrai ?
Si oui; comment projeter mon vecteur sur un plan suivant une direction ?

Merci !



Avatar de l’utilisateur
chan79
Membre Légendaire
Messages: 10330
Enregistré le: 04 Mar 2007, 19:39

par chan79 » 27 Fév 2014, 18:12

Salut
Tu pourrais voir quel vecteur fait l'angle le plus petit avec un vecteur directeur de la normale au plan.

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21693
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 27 Fév 2014, 20:16

Salut,
Le fond du problème, c'est de savoir ce que tu entend par "le plus proche possible de la normale".
La façon dont tu voit les choses (regarder celui qui a la projection sur le plan la plus petite possible) ne me semble (personellement) pas terrible : si tu as un vecteur faisant un angle de 45° avec le plan mais de longueur trés faible la longueur de sa projection sera plus courte que celle d'un vecteur faisant un angle de 89.5° avec le plan mais de longueur trés trés grande. A mon sens, j'aurais quand même dit que celui faisant un angle de 89.5° avec le plan était "plus proche" de la normale que l'autre et donc j'aurais plutôt regardé les angles comme le suggère chan79.

En plus, ce n'est pas tellement plus compliqué vu qu'il te suffit de prendre la norme du projeté divisée par la norme du vecteur de départ (ce qui te donne le cosinus de l'angle entre le plan et le vecteur)
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 28 Fév 2014, 01:34

Pareil : je pense que la comparaison doit se faire sur l'angle : plus l'angle entre le vecteur et un vecteur normal du plan est proche de 0, plus on est proche de la verticale.

Pour connaître cet angle, un moyen simple est de calculer le produit scalaire. En effet, on sait que :
u.v = |u| |v| cos(u, v)
d'où :
cos(u, v) = (u.v) / ( |u| |v| ).

Plus le cosinus est proche de 1, plus on est proche de la verticale.

Rappelons qu'un vecteur normal du plan d'équation ax+by+cz+d=0 est le vecteur de coordonnées (a, b, c). Donc si notre vecteur a pour coordonnées (x, y, z) le calcul précédent devient :

.

(Sauf erreur de calcul...)

Vicolaships
Messages: 2
Enregistré le: 27 Fév 2014, 17:21

par Vicolaships » 28 Fév 2014, 09:21

Ben314 a écrit:si tu as un vecteur faisant un angle de 45° avec le plan mais de longueur trés faible la longueur de sa projection sera plus courte que celle d'un vecteur faisant un angle de 89.5° avec le plan mais de longueur trés trés grande. A mon sens, j'aurais quand même dit que celui faisant un angle de 89.5° avec le plan était "plus proche" de la normale

C'est exact j'avais pas pensé à ça; j'ai bien fait de poser la question !
EDIT: Mes vecteurs ont tous une norme de 1 alors ça doit rester correct avec cette hypothèse

Pour connaître cet angle, un moyen simple est de calculer le produit scalaire. En effet, on sait que :
u.v = |u| |v| cos(u, v)
d'où :
cos(u, v) = (u.v) / ( |u| |v| ).


Effectivement c'est pas très compliqué. J'ai testé dans mon contexte et ça marche du tonnerre.
Le code en C++ utilisant les vecteurs d'Eigen :

Code: Tout sélectionner
   // Copie des vecteurs normaux aux plans
   Eigen::Vector3f v_plane_ground, v_plane_1, v_plane_2, v_plane_3;
        // Remplir les vecteurs ici !

   // Plus le coeff est proche de 1 plus le vecteur est proche de la norme de plane_ground:
   // cos(u,v) = (u.v) / (|u|*|v|)
   float coeff_vertical_1 = v_plane_ground.dot(v_plane_1) / (v_plane_ground.norm() * v_plane_1.norm());
   float coeff_vertical_2 = v_plane_ground.dot(v_plane_2) / (v_plane_ground.norm() * v_plane_2.norm());
   float coeff_vertical_3 = v_plane_ground.dot(v_plane_3) / (v_plane_ground.norm() * v_plane_3.norm());


Dans mon contexte j'ai un nuage de points 3D dans lequel je trouve 4 plans; le sol et 3 plans d'une boite posée par terre. La segmentation trouve les plans les plus grands en premier. Pour des raisons pratiques je dois assurer que l'ordre des plans est toujours le même. Grâce a l'équation du plan du sol (et à vous) je suis maintenant capable de déterminer quel est le plan horizontal :++:

EDIT: J'ai oublié de préciser mais il faut prendre le maximum de la valeur absolue des coeff !

Pour les 2 autres plans c'est facile; je calcule les 2 centres de gravité des plans, le plus a gauche sera le plan 2 et le plus a droite le plan 3 (par convention).

Merci pour vos réponses, sujet résolu ! A+

 

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