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+