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

Algorithmes et structures de données Discussion :

Rotation d'un angle quelconque autour d'un axe


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Points : 13
    Points
    13
    Par défaut Rotation d'un angle quelconque autour d'un axe
    Bonjour,

    Je galère pour trouver l'agorithme correct pour la "Rotation3D"

    J'ai trouvé ceci ce matin
    https://www.developpez.net/forums/d8...t-3d-distance/

    Ce qui donne les coordonnées du projeté P du point sur l'axe. J'ai essayé ça fonctionne.

    Maintenant pour la rotation je crois, et si on veut faire tourner beaucoup de points il faut calculer la matrice de rotation en fonction de XP (droite perpendiculaire à l'axe AB.

    Puis faire M.X => X' (point "rotationné")

    Voilà pour calculer la matrice comment faire?

    On a le vecteur directeur de l'axe disons V ou U1
    On a P P0 si on le divise par la norme |PP0| on obtient un deuxième vecteur unitaire. U2
    Pour le troisième on fait U1^U2 = U3.

    Mais là comment les mettre sous forme matricielle, en lignes, en colonnes?

    A l fin M*X = X'
    Puis finalement repositionner le point dans l'espace réel: P+X'

    Non je crois que la fin du raisonnement est fausse. mais à partir de P, U2, et U3, on peut faire une matrice de rotation non?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Points : 13
    Points
    13
    Par défaut Voici ce que j'ai trouvé en 2 heures. Çà a l'air de bien fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    /*
     * This file is part of Plants-Growth-2
     *     Plants-Growth-2 is free software: you can redistribute it and/or modify
     *     it under the terms of the GNU General Public License as published by
     *     the Free Software Foundation, either version 3 of the License, or
     *     (at your option) any later version.
     *
     *     Plants-Growth-2 is distributed in the hope that it will be useful,
     *     but WITHOUT ANY WARRANTY; without even the implied warranty of
     *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     *     GNU General Public License for more details.
     *
     *     You should have received a copy of the GNU General Public License
     *     along with Plants-Growth-2.  If not, see <http://www.gnu.org/licenses/>.
     */
     
    package be.manudahmen.growth.graphics;
     
    import be.manudahmen.empty3.Matrix33;
    import be.manudahmen.empty3.Point2D;
    import be.manudahmen.empty3.Point3D;
     
    /***
     *  Rotation d'un angle quelconque autour d'un axe
     Bonjour,
     
     Je galère pour trouver l'agorithme correct pour la "Rotation3D"
     
     J'ai trouvé ceci ce matin
     https://www.developpez.net/forums/d8...t-3d-distance/
     
     Ce qui donne les coordonnées du projeté P du point sur l'axe. J'ai essayé ça fonctionne.
     
     Maintenant pour la rotation je crois, et si on veut faire tourner beaucoup de points il faut calculer la matrice de rotation en fonction de XP (droite perpendiculaire à l'axe AB.
     
     Puis faire M.X => X' (point "rotationné")
     
     Voilà pour calculer la matrice comment faire?
     
     On a le vecteur directeur de l'axe disons V ou U1
     On a P P0 si on le divise par la norme |PP0| on obtient un deuxième vecteur unitaire. U2
     Pour le troisième on fait U1^U2 = U3.
     
     Mais là comment les mettre sous forme matricielle, en lignes, en colonnes?
     
     A l fin M*X = X'
     Puis finalement repositionner le point dans l'espace réel: P+X'
     
     Non je crois que la fin du raisonnement est fausse. mais à partir de P, U2, et U3, on peut faire une matrice de rotation non? Rotation d'un angle quelconque autour d'un axe
     Bonjour,
     
     Je galère pour trouver l'agorithme correct pour la "Rotation3D"
     
     J'ai trouvé ceci ce matin
     https://www.developpez.net/forums/d8...t-3d-distance/
     
     Ce qui donne les coordonnées du projeté P du point sur l'axe. J'ai essayé ça fonctionne.
     
     Maintenant pour la rotation je crois, et si on veut faire tourner beaucoup de points il faut calculer la matrice de rotation en fonction de XP (droite perpendiculaire à l'axe AB.
     
     Puis faire M.X => X' (point "rotationné")
     
     Voilà pour calculer la matrice comment faire?
     
     On a le vecteur directeur de l'axe disons V ou U1
     On a P P0 si on le divise par la norme |PP0| on obtient un deuxième vecteur unitaire. U2
     Pour le troisième on fait U1^U2 = U3.
     
     Mais là comment les mettre sous forme matricielle, en lignes, en colonnes?
     
     A l fin M*X = X'
     Puis finalement repositionner le point dans l'espace réel: P+X'
     
     Non je crois que la fin du raisonnement est fausse. mais à partir de P, U2, et U3, on peut faire une matrice de rotation non?
     */
    public class Rotation2 {
        private static double Epsilon = 0.000001;
     
        /** Methode qui calcule la projection orthogonale du point P sur une droite D representee par un point X et un vecteur V (P = X + kV).
     *  ATTENTION : cette methode renvoit le coefficient k.
     * @param X Un point de la droite D.
     * @param V Le vecteur directeur de la droite D.
     * @param P Le point dont on souhaite connaitre le projete sur la droite D.
     * @return Le coefficient de k de P = X + kV.*/
            public Point3D IntersectionCoef(Point3D X, Point3D V, Point3D P)
            {
                int Size = 3 ;
                double num = 0.0, den = 0.0 ;
     
                for (int i=0 ; i < Size ; i++)
                {
                    num += V.get(i) * (P.get(i)-X.get(i)) ;
                    den += Math.pow(V.get(i), 2.0) ;
                }
     
                if ( Math.abs(den) < Epsilon ) throw new ArithmeticException("Denominator equal to zero => Vector V is a vector null.") ;
                P = X.plus(V.mult(num / den));
     
                return P;
            }
     
     
        /***
         *
         * @param X Point à faire tourner
         * @param A Point de la droite d (premier)
         * @param B Point de la droite d (deuxième)
         * @param angle Angle de rotation
         * @return résultat
         */
            public Point3D rotation( Point3D X, Point3D A, Point3D B, double angle)
            {
                Point3D V = B.moins(A);
                Point3D P = IntersectionCoef(A, V, X);
                Point3D u1 = V.norme1();
                Point3D u2 = X.moins(P).norme1();
                Point3D u3 = u1.prodVect(u2);
     
                double distance = P.moins(X).norme();
     
                Matrix33 rotationPlanPperdAB = new Matrix33(new double[]
                        {
                                Math.cos(angle), Math.sin(angle), 0,
                                -Math.sin(angle), Math.cos(angle), 0,
                                0, 0, 1
                        });
                Point3D pU2U3 = new Point3D(distance, 0, 0);
     
                Point3D res = u2.mult(pU2U3.getX()).plus(u3.mult(pU2U3.getY()));
     
                return P.plus(res);
            }
     
    }
    Ca a l'air de bien fonctionner sauf:
    Point sur l'axe :> NaN
    Et quelques uns de mes tests ne fonctionnent pas.

    Si je parle tout seul pour le moment j’espère que ça en aidera d'autres à l'avenir.

    https://gitlab.com/snippets/1701128

  3. #3
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Rotation d'un angle quelconque autour d'un axe
    Citation Envoyé par manueldahmen Voir le message
    ... Je galère pour trouver l'agorithme correct pour la "Rotation3D"

    J'ai trouvé ceci ce matin
    https://www.developpez.net/forums/d8...t-3d-distance/ ...
    Bonjour,

    Il est difficile de comprendre ce que tu cherches, et le premier lien cité ne donne rien (Page not found).

    Les références concernant les angles d'Euler sont nombreuses, tant pour les définitions & calculs que pour les schémas animés:
    1_
    2_
    3_

    Il faut exprimer les vecteurs par des matrices colonnes; le calcul consiste généralement à passer des coordonnées fixes (X1, Y1, Z1) d'un point (P) du repère mobile à celles du même point (x, y, z) dans le repère fixe, et qui dépendent des trois angles (nutation, précession, rotation).


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  4. #4
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Rotation d'un angle quelconque autour d'un axe
    Si l'on s'en tient strictement à l'intitulé de ta demande, il est possible de ne pas employer les relations d'Euler, qui décrivent le basculement quelconque d'un solide dans l'espace; le seul mouvement en cause est ici la rotation autour d'un axe fixe.

    Soit dans un repère orthonormé direct (Oxyz) un axe de rotation passant par l'origine (O), orienté par le vecteur unitaire (w), et un point quelconque (P) de coordonnées (x, y, z), dont la position est définie par le vecteur OP = x.i + y.j + z.k .

    Il suffit de définir deux nouveaux vecteurs unitaires par les produits vectoriels:

    v = ║w×OP-1.(w×OP) (orthogonal à w et OP);

    u = (v×w) (orthogonal à v et w, et constituant avec les deux précédents un trièdre direct).

    La position du point (P) dans le nouveau repère ainsi constitué s'exprime par la relation:
    OP = X.u + Y.v + Z.w , dans laquelle les coordonnées cartésiennes sont données par les produits scalaires:
    X = (OPu) , Y = (OPv) , Z = (OPw) .

    Une rotation d'angle (t) autour de l'axe considéré conduira à un autre point (P')
    OP' = X'.u + Y'.v + Z'.w
    dont les coordonnées s'expriment par les relations:
    X' = X*Cos(t) - Y*Sin(t) ; Y' = X*Sin(t) + Y*Cos(t) ; Z' = Z (résultats écrits à la volée, à vérifier).


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/12/2009, 23h21
  2. Rotation de 2 objets autour d'un axe
    Par dimainfo dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 19/05/2009, 19h15
  3. rotation autour d'un axe
    Par aseau dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 17/04/2009, 16h04
  4. rotation d'angle quelconque d'image
    Par salihovic dans le forum Windows Forms
    Réponses: 17
    Dernier message: 12/02/2008, 09h14

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