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 :

technique de rotation dans un repere


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Par défaut technique de rotation dans un repere
    Bonjour,


    j'ai une fonction qui me permet de creer un rectangle avec deux points de coordonnées x et Y : son coin superieur gauche et son coin inferieure droit.


    VOici le schéma qui suit mes explication :




    j'aimerais donc creer une fonction qui effectue la rotation de ce rectangle par son Coin inferieure gauche ( Donc le point B ).

    Cet rotation s'effectue point par point, je calcule les nouvelles coordonnées du Point A puis celle Du point C , puis je retrace le rectangle ( d'ailleurs je ne sais pas si c'est une bonne méthode de prendre point a point .. )

    en rouge est representé le nouveau rectangle.

    jusqu'ici j'ai appliqué plusieurs methodes sans succée mon rectangle se trouvant deformé :/

    j'ai appliqué une methode trigonométrique, si il y a une autre méthode qui marche je prend tout de suite :

    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
     
     
    proc rotater_(  entier  x , entier y , entier  point_de_rot_x, entier  point_de_rot_y, entier angle )
    {
     
        entier  x_sauv  = x;
     
       entier r_angle = ((angle *3.1415) /360); //conversion en radian
     
     
     
        x_sauv = (  (x - point_de_rot_x) * cos (r_angle) ) -  (  ((y - point_de_rot_y) * (sin (r_angle))) + point_de_rot_x  );
     
        y =  (  (x - point_de_rot_x) * sin(r_angle) ) +  (  ((y - point_de_rot_y) * (cos (r_angle)))  + point_de_rot_y );
     
        x = x_sauv;
    }
    Ce code tourne bien le rectangle mais le deforme complétement ( agrandissement verticale par 7 ou 8 )




    Voila merci

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    bien le bonjour,

    Ce code tourne bien le rectangle mais le deforme complétement ( agrandissement verticale par 7 ou 8 )
    ça me fait penser à une rotation non centrée en 0.

    pour faire une rotation autour d'un point différent de l'origine du repère, il faut changer de repère pour se ramener à un repère dont l'origine sera centre de rotation.

    Donc, tout d'abord, tu fais une translation de ton rectangle pour que son point B soit l'origine du nouveau repère, ensuite tu fais ta rotation avec la matrice de rotation qui va bien, puis tu refais une translation pour revenir à tes coordonnées réelles.

    ce qui donne en terme matriciel ... ce que tu as fait

    par contre, ce qui me dérange, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entier r_angle = ((angle *3.1415) /360); //conversion en radians
    /180 ?
    Aussi, le type entier n'est pas adapté pour stocker un angle an radians et des coordonnées pleines de sinus et cosinus.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Par défaut reponse
    Bonjour,

    en effet ma conversion etais fausse merci j'ai rajouté egalement des double pour contenir les cosinus par contre j'ai toujours la deformation du rectangle et je ne comprends pas pourquoi :/

    Voici mon nouveau code:
    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
     
    void rotater_( int &x, int &y , int point_de_rot_x, int point_de_rot_y, int angle )
    {
     
        double x_sauv  = x;
     
     
        double y_sauv = y;
     
        int r_angle = ((angle *3.1415) /180);//conversion en radian
     
     
     
        x_sauv = (  (x - point_de_rot_x) * cos (r_angle) ) -  (  ((y - point_de_rot_y) * (sin (r_angle))) + point_de_rot_x  );
     
        y_sauv =  (  (x - point_de_rot_x) * sin(r_angle) ) +  (  ((y - point_de_rot_y) * (cos (r_angle)))  + point_de_rot_y );
     
        x = (int)x_sauv;
     
        y = (int)y_sauv;
     
     
     
     
     
    }

    et avec l'image en violet le rectangle qu'il me trace

    Merci a vous

  4. #4
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par défaut
    Votre code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
        x_sauv = (  (x - point_de_rot_x) * cos (r_angle) ) -  (  ((y - point_de_rot_y) * (sin (r_angle))) + point_de_rot_x  );
     
        y_sauv =  (  (x - point_de_rot_x) * sin(r_angle) ) +  (  ((y - point_de_rot_y) * (cos (r_angle)))  + point_de_rot_y );
    contient un jeu de parenthèses en trop. il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
        x_sauv = (  (x - point_de_rot_x) * cos (r_angle) ) -  ((y - point_de_rot_y) * (sin (r_angle))) + point_de_rot_x ;
     
        y_sauv =  (  (x - point_de_rot_x) * sin(r_angle) ) +  ((y - point_de_rot_y) * (cos (r_angle)))  + point_de_rot_y;
    et en supprimant les parenthèses inutiles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
         x_sauv =  (x - point_de_rot_x) * cos (r_angle) - (y - point_de_rot_y) * sin (r_angle) + point_de_rot_x ;
     
        y_sauv =  (x - point_de_rot_x) * sin(r_angle)  +  (y - point_de_rot_y) * cos (r_angle)  + point_de_rot_y;

Discussions similaires

  1. creation d'un nouveau repere dans un repere parent
    Par tonyblinson dans le forum MATLAB
    Réponses: 0
    Dernier message: 02/05/2008, 02h09
  2. Techniques de recherche dans Excel
    Par Laura-c dans le forum Excel
    Réponses: 11
    Dernier message: 03/03/2008, 10h29
  3. Réponses: 2
    Dernier message: 19/09/2007, 14h17
  4. Rotation dans l'espace
    Par benjaminM dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 25/05/2007, 16h12
  5. rotations dans l'espace -validation d'un modèle mathématique
    Par khayyam90 dans le forum Mathématiques
    Réponses: 20
    Dernier message: 16/08/2005, 13h26

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