Partage
  • Partager sur Facebook
  • Partager sur Twitter

Décomposer une rotation en 2 rotations sur X et Y

Sujet résolu
    15 août 2022 à 13:46:07

    Bonjour,

    Après avoir cherché en vain sur le net, je me résout à poser ma question ici

    Soit un point de coordonnées XYZ

    Je le fais tourner dans l'espace d'un angle alpha autour d'un axe arbitraire, cet axe étant lui-même dans le plan XY

    J'ai déjà la procédure pour appliquer directement cette rotation, mais je voudrais la décomposer en 2 angles autour de X et Y

    (et donc créer ensuite une matrice de rotation sur X et une autre sur Y, à appliquer au point)

    J'ai une solution à base de calculs successifs avec sinus et cosinus mais trouvée à partir d'une configuration donnée, or je voudrais plutôt une solution universelle ...

    Merci d'avance à celles et ceux qui voudront bien répondre

    -
    Edité par Phil_1857 15 août 2022 à 13:47:39

    • Partager sur Facebook
    • Partager sur Twitter
      18 août 2022 à 1:54:18

      Salut,
      Je ne prétend pas avoir trouvé une solution, J'essaie seulement d'explorer une avenue.
      Ton axe de rotation est bien dans le plan XY? Ses coordonnées en Z sont donc nulles.
      Cet axe a forcément un angle par rapport à l'axe des X, et complémentaire par rapport à l'axe des Y.
      L'amplitude de la rotation par rapport à l'axe des X est proportionnelle au cos() de cet angle.
      Et l'amplitude par rapport à l'axe des Y est proportionnelle au sin() de cet angle.
      Je suppose que tu as déjà calculé la distance du point XYZ par rapport à cet axe?
      Elle correspondra au rayon du cercle de rotation.
      Sa projection sur le plan YZ sera proportionnelle au cosde l'angle.
      Et sa projection sur le plan XZ sera proportionnelle au sin de l'angle.
      Le centre de ces cercles de rottation devraient se trouver au même endroit sur l'axe.
      Je n'ai pas trouvé comment le calculer.
      Je ne sais pas si ça ressemble à un problème que j'avais rencontré.
      Je voulais calculer la durée du jour au solstice pour toutes les lattitudes (nord et sud).

      edit:

      On calcule d'abord la distance orthogonale entre le point XY et la droite de l'axe:

      https://fr.wikipedia.org/wiki/Distance_d%27un_point_%C3%A0_une_droite

      https://fr.acervolima.com/distance-perpendiculaire-entre-un-point-et-une-ligne-en-2d/

      On obtiendra le point d'intersection qui sera le centre de nos certles.

      La distance 3D ou rayon est calculé avec la distance obtenue en 2D et la coordonnée en Z.

      -

      En réalité, on n'a pas affaire à des cercles mais à des ellipses dans les plans YZ et XZ.

      Il faut donc convertir l'équation de rotation sur un cercle en rotation sur des ellipses.

      -
      Prenons le problème à l'envers.
      J'ai un cercle dans le plan XY et je déplace un point sur la circonférence.
      On peut exprimer les coordonnées de façon cartésienne ou circulaire.
      Si je pose que  x = rayon * cos(angle) et y = rayon * sin(angle)
      Je fais tourner mon rayon d'un angle alpha.
      J'aurai x = rayon * cos(angle+alpha) et y = rayon * sin(angle+alpha)
      Supposons que "j'incline" mon plan XY et que je projette mes déplacements sur un "faux" plan XY.
      Si l'angle entre les deux est theta en X et 0 en Y, j'aurai:
      x' = rayon *cos(angle+alpha) * cos(theta)
      mais y restera inchangé.
      Si j'incline par rapport à Y, ce sera le contraire.
      Un mouvement linéaire en angle apparaîtra comme si les déplacements aux extrémités de l'ellipse ainsi formée seraient plus lents.

      -
      Edité par PierrotLeFou 18 août 2022 à 6:07:30

      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        18 août 2022 à 12:00:34

        Bonjour Pierrot,

        Merci pour ta réponse, en fait, j'ai trouvé la solution entre temps !

        Comme je te le disais, j'ai déjà la procédure pour appliquer une rotation arbitraire à un point

        Donc en entrant les coordonnées x, y, z du point, j'obtiens les coordonnées après rotation x1, y1, z1

        J'ai trouvé le calcul qui permet, ayant x, y, z et x1, y1, z1 en entrée, de trouver la rotation

        autour de l'axe X du repère, et la rotation autour de l'axe Y du repère

        En Python, ça donne ceci (je te passe ma biblio qui contient mes classes Point_3D et Vec_3D):

        print('\n*** Passer d"une rotation sur un axe arbitraire à 2 rotations sur X et Y ***')
        x,y = 100.0,100.0
        v = Vec_3D(36.397,-100,0.0) #angle : 20 degrés
        v.unitize()
        pt = Point_3D(x,y,0.0)
        angle = 30.0
        
        print('\nRotation du point {} de {} degrés sur {} :'.format(pt,angle,v))
        pt.ArbitraryRotate(v,angle)
        print(pt)
        
        #Calcul des rotations sur X et Y à partir des coordonnées de départ et d'arrivée
        
        #Rotations X
        rx = acos(pt.y/y)
        z = pt.y*tan(rx)
        
        #Rotation Y
        a1 = atan(z/x)
        r = x/cos(a1)
        a2 = acos(pt.x/r)
        ry = a1-a2
        
        print('\nRotations sur X et Y : {}   {}'.format(degrees(rx),degrees(ry)))
        


        Plus plus de clarté, je devrais joindre une image, mais je crois que tu ne la verrais pas ..

        -
        Edité par Phil_1857 18 août 2022 à 12:04:10

        • Partager sur Facebook
        • Partager sur Twitter

        Décomposer une rotation en 2 rotations sur X et Y

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown