IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Calculer le signe de l'angle entre 2 vecteurs. (en 3D)


Sujet :

Mathématiques

  1. #1
    Invité
    Invité(e)
    Par défaut Calculer le signe de l'angle entre 2 vecteurs. (en 3D)
    Salut, j'essaye de calculer le signe de l'angle entre 2 vecteurs en 3D mais je rencontre quelques difficultés.

    Voici une image qui montre ce que je veux faire :

    Nom : angle.jpg
Affichages : 3218
Taille : 22,4 Ko

    Je voudrais le signe des 2 angles. (l'un est négatif, l'autre est positif)

    J'ai essayer cet algorithme mais ça ne fonctionne pas, mes 2 angles sont de même signe :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    float Vec3f::getAngleBetween (const Vec3f &other) {
        if(isNulVector() || other.isNulVector())
            return 0;
        float dotProduct = dot(other);
        Vec3f n3 = normalize().cross(other.normalize());
        Vec3f n1 = normalize();
        Vec3f n2 = other.normalize();
        Matrix4f matrix (n1.x, n1.y, n1.z, 0, n2.x, n2.y, n2.z, 0, n3.x, n3.y, n3.z, 0, 0, 0, 0, 1);
        float fDet = matrix.getDet();
        if (fDet >= 0)
            return Math::acosinus(dotProduct);
        else
            return -Math::acosinus(dotProduct);
    }

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Vec3f v1(-50, 33.3333, 0);
    Vec3f v2(50, 33.3333, 0);
    Vec3f v3 (0, 33.3333, 0);
    std::cout<<v.getAngleBetween(v1)<<" "<<v.getAngleBetween(v2)<<std::endl;

    Voilà donc si quelqu'un pourrait m'aider ça serait sympa.
    Dernière modification par Invité ; 02/07/2014 à 15h57.

  2. #2
    Invité
    Invité(e)
    Par défaut
    J'ai trouvé une solution mais il me faut définir les normales manuellement comme ceci :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    float Vec3f::getAngleBetween (const Vec3f &other, const Vec3f &n) {
        if(isNulVector() || other.isNulVector())
            return 0;
        float cosinus = dot(other);
        Vec3f crs = cross(other);
        if (n.dot(crs) < 0)
            return -Math::acosinus(cosinus);
        return Math::acosinus(cosinus);
    }

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vec3f v1(-50, 33.3333, 0);
    Vec3f v2(50, 33.3333, 0);
    Vec3f v3 (0, 33.3333, 0);
    std::cout<<v.getAngleBetween(v1, v.cross(v1))<<" "<<v.getAngleBetween(v2, v2.cross(v)<<std::endl;
    Dernière modification par Invité ; 03/07/2014 à 00h51.

  3. #3
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    calculer le signe de l'angle entre 2 vecteurs en 3D
    L'angle entre 2 vecteur n'a pas de signe: si on le regarde d'un côté, il est positif et vu de l'autre il est négatif.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    L'angle entre 2 vecteur n'a pas de signe: si on le regarde d'un côté, il est positif et vu de l'autre il est négatif.
    Jean-Marc Blanc
    En effet, l'angle entre deux vecteurs n'a un signe qu'en 2D, car dans ce cas, le point de vue est imposé. Dès que tu passe à un nombre de dimensions supérieur à 2, il n'est pas possible d'y donner "spontannément" un signe.

  5. #5
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Salut,

    Citation Envoyé par Lolilolight Voir le message
    J'ai trouvé une solution mais il me faut définir les normales manuellement comme ceci :
    Plutôt que de les définir manuellement, définis les automatiquement.
    Tu prends ton triangle ABC, tu définis sa normale (genre AB*AC en produit vectoriel, et tu normes). C'est elle qui va "définir" le sens positif de tes angles, pour tous les vecteurs dans le plan de ton triangle (en gros, on se ramène en 2D).

    Tu calcules ensuite ton produit vectoriel vecteur 0 * vecteur 1, tu fais le produit scalaire avec la normale, si c'est positif => angle positif, si c'est négatif => angle négatif.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ouais erreur de ma part désolé, j'ai pris la normale du triangle (qui est v1.cross(v2)) et j'ai calculé le signe en fonction de cette normale et maintenant ça marche.

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Vec3f v1(-50, 33.3333, 0);
    Vec3f v2(50, 33.3333, 0);
    Vec3f v3 (0, 33.3333, 0);
    std::cout<<v.getAngleBetween(v1, v1.cross(v2))<<" "<<v.getAngleBetween(v2, v1.cross(v2)<<std::endl;

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    float Vec3f::getAngleBetween (const Vec3f &other, const Vec3f &n) {
        if(isNulVector() || other.isNulVector())
            return 0;
        float cosinus = dot(other);
        if (cosinus == 1)
            return 0;
        Vec3f crs = cross(other);
        if (n.dot(crs) < 0)
            return Math::acosinus(cosinus);
        return -Math::acosinus(cosinus);
    }
    Sujet résolu.
    Dernière modification par Invité ; 05/07/2014 à 12h34.

Discussions similaires

  1. Angles entre deux vecteurs - résultats incompréhensibles
    Par nono2801 dans le forum Mathématiques
    Réponses: 3
    Dernier message: 04/05/2011, 09h56
  2. [GLSL] Calculer un angle entre deux vecteurs.
    Par who_knows dans le forum OpenGL
    Réponses: 5
    Dernier message: 05/05/2010, 17h40
  3. Programmation Python angles entre deux vecteurs
    Par Manudu38 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 18/11/2009, 18h17
  4. Calcul d'angle entre deux vecteurs
    Par feynman dans le forum Fortran
    Réponses: 8
    Dernier message: 22/09/2007, 13h59
  5. Calcul d'angle entre 2 vecteurs - direction
    Par lothei dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 03/09/2007, 19h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo