Partage
  • Partager sur Facebook
  • Partager sur Twitter

Calcul angle dièdre

à partir des coordonnées

Sujet résolu
    21 février 2012 à 16:02:40

    Bonjour à tous,

    voila mon problème:
    On me donne les coordonnées de 4 points dans l'espaces A,B,C,D, A étant relié à B, lui-même relié à C, lui-même relié à D.

    Et on me demande de calculer la valeur de l'angle dièdre correspondant, le tout en python.
    Si quelqu'un aurait une formule à me donner ou une piste pour que je chercher je suis preneur.

    merci d'avance

    Cédric
    • Partager sur Facebook
    • Partager sur Twitter
      21 février 2012 à 16:13:31

      j'ai déja regardé cette page à ne m'éclaircie pas le problème
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        21 février 2012 à 16:28:11

        Bah tu considères le plan formé par les vecteur (AB;BC) et par les vecteurs (BC;CD).
        Après suffit de calculer un vecteur normal unitaire pour chacun des plans (je te laisse deviner comment) puis de faire le produit scalaire entre les vecteurs normaux pour avoir l'angle.
        • Partager sur Facebook
        • Partager sur Twitter
          21 février 2012 à 16:57:11

          jusque la ok je te suis maintenant le souci est que je doit avoir un angle avec un signe.

          Quand on regarde dans la direction BC je dois partir de AB et aller jusqu'à CD mais je ne vois pas du tout comment faire
          • Partager sur Facebook
          • Partager sur Twitter
            21 février 2012 à 17:13:35

            Au lieu du produit scalaire, utilise le produit vectoriel… ;)
            • Partager sur Facebook
            • Partager sur Twitter
              21 février 2012 à 18:33:26

              mais cours de géométrie remontent déja à plusieurs années.

              donc si je comprend bien je dois faire le produit scalaire pour avoir le cos et le produit vectoriel pour avoir le sin et trouver la valeur de l'angle avec les deux ou alors je peux faire directement avec le produit vectoriel?
              • Partager sur Facebook
              • Partager sur Twitter
                21 février 2012 à 18:54:16

                Si tu veux un angle entre 0 et 180°, seul le cosinus suffit (donc le produit scalaire).
                Si tu veux un angle entre -90° et +90°, seul le sinus suffit (donc le produit vectoriel).
                Si tu veux un angle entre -180° et +180° (ou entre 0 et 360°), il te faut les deux.
                • Partager sur Facebook
                • Partager sur Twitter
                  21 février 2012 à 19:58:08

                  oui je veux un angles entre -180 et +180 donc j'utiliserai les deux merci

                  edit: sujet résolu merci :D
                  il fallait également utilisé un determinant pour avoir le signe
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 mai 2019 à 22:54:10

                    On vient de me poser la question. Voici donc la solution pour ceux qui pourraient être interessés:

                    import math
                    
                    
                    def distance(coord1, coord2):
                        """
                        Retourne la distance entre 2 coordonnees
                        """
                        return math.sqrt((coord1[0]-coord2[0])**2+\
                                         (coord1[1]-coord2[1])**2+\
                                         (coord1[2]-coord2[2])**2)
                    
                    def produitvectoriel(vect1,vect2):
                        """
                        Cette fonction renvoie le produit vectoriel de deux vecteurs
                        """
                        return (vect1[1]*vect2[2]-vect1[2]*vect2[1],
                                vect1[2]*vect2[0]-vect1[0]*vect2[2],
                                vect1[0]*vect2[1]-vect1[1]*vect2[0])
                    
                    def produitscalaire(vect1,vect2):
                        """
                        Cette fonction renvoie le produit scalaire de deux vecteurs
                        """
                        return (vect1[0]*vect2[0]+vect1[1]*vect2[1]+vect1[2]*vect2[2])            
                                
                    def norme(vecteur):
                        """
                        Cette fonction renvoie la norme d'un vecteur
                        """
                        return distance(vecteur,(0,0,0))
                        
                        
                    def angles_dihedre(coor1,coor2,coor3,coor4):
                        """
                        Cette fonction renvoie la valeur de l'angle diedre à partir des coordonnees
                        de quatres points de l'espace
                        """
                        
                        vecteur12=(coor1[0]-coor2[0],coor1[1]-coor2[1],coor1[2]-coor2[2])
                        vecteur23=(coor2[0]-coor3[0],coor2[1]-coor3[1],coor2[2]-coor3[2])
                        vecteur34=(coor3[0]-coor4[0],coor3[1]-coor4[1],coor3[2]-coor4[2])
                    
                        vecteur_normal1=produitvectoriel( vecteur12,vecteur23 )
                        vecteur_normal2=produitvectoriel( vecteur23,vecteur34 )
                    
                        if produitscalaire(vecteur23,produitvectoriel(vecteur_normal1,vecteur_normal2))<0:
                            return math.acos(produitscalaire(vecteur_normal1,vecteur_normal2)/\
                                        (norme(vecteur_normal1)*norme(vecteur_normal2)))*180/math.pi
                        else:
                            return -math.acos(produitscalaire(vecteur_normal1,vecteur_normal2)/\
                                        (norme(vecteur_normal1)*norme(vecteur_normal2)))*180/math.pi
                        
                    



                    • Partager sur Facebook
                    • Partager sur Twitter

                    Calcul angle dièdre

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown