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 rectangle autour du centre de gravité


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 8
    Points : 6
    Points
    6
    Par défaut [Resolu] Rotation d'un rectangle autour du centre de gravité
    Bonjour,

    N'étant pas un expert en géométrie, j'aimerais avoir un algo permettant de calculer les nouvelles coordonnées des 4 coins du rectangle losque l'on lui à appliquer une rotation d'un angle donné par rapport à son centre de gravité.

  2. #2
    Rédacteur

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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    bien le bonjour

    je pense que les nombres complexes pourront t'aider :

    coordonnées du centre de grav : xg = moyenne des xi, pareil pour yg.

    le premier coin A de ton rectangle a les coordonnées (x1,y1).
    primo tu changes de repère et tu prends un repère centé sur G, les nouvelles coordonnées de A deviennent (x1-xg, y1-yg). l'affixe de A dans ce repère est donc

    za=sqrt(abscisse²+ordonnée²).exp(i.arctan(ordonnée/abscisse)) en notation exponentielle, si je dis pas de bêtises.

    tu fais une rotation de centre G donc le module ne changera pas c(est cool).
    Après rotation d'angle théta, tu as

    za'=sqrt(la même chose).exp(i.(arctan(....) + théta )).

    ensuite, tu redécomposes en écriture algébrique : par exemple z=m*exp(i*théta) est égal à m.cos(thétha) + i.m.sin(théta) et tu peux en tirer les coordonnées de ton point DANS LE REPERE CENTRE SUR G. warning!

    mais, tu rajoutes xg et yg à tes coordonnées nouvellement obtenues pour avoir les coordonnées recherchées.

    j'espère que c'est juste !

    pour faire simple disons que

    xa'=sqrt( (xa-xg)²+(ya-yg)² ). cos (Arctan( (ya-yg)/(xa-xg) ) + théta ) + xg

    ya'=sqrt( (xa-xg)²+(ya-yg)² ). sin(Arctan( (ya-yg)/(xa-xg) ) + théta ) + yg

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    J'ai l'impression que ton algo ne fonctionne pas.
    Voici la traduction java de ton algo:

    les coordonnees du rectangle sont dans 2 tableaux xpoints et ypoints de taille 4, je parcours donc les 2 tableaux enincrementant i.

    Voici le resultat:
    Rectangle de depart:
    Point0: (100;100)
    Point1: (150;50)
    Point2: (300;200)
    Point3: (250;250)
    Rectangle obtenu pour une rotation de 90°: -> il est défomé
    Point0(:200;200)
    Point1(:123;338)
    Point2(:250;225)
    Point3(:193;247)

  4. #4
    Rédacteur

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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    je suis pas un pro du java mais il me semble que ta racine carrée n'est pas refermée. Autre chose, les unités d'angles sont-elles bien les mêmes ? degrés / radians.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    j'ai effacé effectivement la parenthese de fin de la racine carré, mais elle y figure bien dans mon programme, donc ca ne vient pas de ca

    Je fais une conversion degré vers radian
    ca ne vient pas de ca non plus.

  6. #6
    Rédacteur

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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    je suppose que tu fais un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    boucle i de 1 à 4
    poly.xpoints[i]=....
    poly.ypoints[i]=....
    finboucle
    et donc tu écrases les coordonnées du premier rectangle par celle du second, mais dans ton poly.ypoints[i], tu appelles xpoints[i] que tu viens juste de modifier. tu mélanges les coordonnées de tes deux rectangles.

    prends 2 tableaux bien séparés.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    effectivement, je faisais comme ca, j'ai corrigé en placant les x du rectangle dans une var temporaire que j'utilise dans le calcul des nouveaux y.
    Mais malheureusment ca ne marche toujours pas.

    Je te remercie pour ton aide aussi bien en geometrie que pour le debuggage.

    voici le code complet de ma fonction :

    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
     
    public void rotation(double a)
    {
    /*conversion en radian*/
    a=Math.toRadians(a);
    int temp;
    for(int i=0;i<poly.npoints;i++)
    {
        temp=poly.xpoints[i];
        System.out.print("Point"+i
                              +":("+poly.xpoints[i]+";"+poly.ypoints[i]+")");
        poly.xpoints[i]= (int)((  Math.sqrt( 
                                               (poly.xpoints[i]-centreGravite().x)
                                             *(poly.xpoints[i]-centreGravite().x)
    		        +(poly.ypoints[i]-centreGravite().y)
                                             *(poly.ypoints[i]-centreGravite().y) )
    		     * Math.cos( Math.atan(
                                                (poly.ypoints[i]-centreGravite().y)
                                               /(poly.xpoints[i]-centreGravite().x)) + a )
    		  ) + centreGravite().x);
        poly.ypoints[i]= (int)((  Math.sqrt(
                                               (temp-centreGravite().x)
                                             *(temp-centreGravite().x)
    		         +(poly.ypoints[i]-centreGravite().y)
                                             *(poly.ypoints[i]-centreGravite().y))
    		    * Math.sin( Math.atan(
                                               (poly.ypoints[i]-centreGravite().y)
                                              /(temp-centreGravite().x)) + a )
    		) + centreGravite().y);
       System.out.println(" / Point"+i+
                                    ":"+poly.xpoints[i]+";"+poly.ypoints[i]+")");
    }
    Les resultats donnent:
    Ancien point / Point nouveau
    Point0: (100;100) / Point0:149;269)
    Point1: (150;50) / Point1:25;233)
    Point2: (300;200) / Point2:186;356)
    Point3: (250;250) / Point3:120;404)

    En faisant sur papier la rotation, je pense que l'on devrait obtenir à peu près:
    Point0150;250)
    Point1100;200)
    Point2250;50)
    Point3300;100)

    Il peut y avoir un probleme d'arrondi, vu que je fais un cast de double en entier mais elle ne doit pas etre si importante

  8. #8
    Rédacteur

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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    je te propose une autre formule un peu plus simple et qui devrait poser moins de problèmes :

    xa'=(xa-xg).cos théta - (ya-yg).sin théta + xg

    ya'=(ya-yg).cos théta + (xa-xg).sin théta + yg

    il suffit de se souvenir que l'écriture complexe d'une rotation est
    z'-oméga = exp(i.théta) . (z-oméga)

    j'espère que cette fois ci ça marchera correctement.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    cet algo marche,
    J'étais bloqué sur ce problème depuis quelques jours et je dois avouer que mes souvenirs sur la géométrie, la trigonométrie et les complexes étaient très vague...
    Un grand merci pour ton aide précieuse et ta rapidité de réponse.

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    salut;
    je suis entrain de faire la meme chose pour pivoter mes rectangles. mais mon probleme c que je veux les afficher dans un BMP, et les valeur retourner par cos et sin sont de nature double. donc pour manipuler des pixel (des entiers) ca marche pa. avez vous une idée ?
    si je cast je v perdre la precision.

    merci et a bientot

  11. #11
    Rédacteur

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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    je pense que le plus simple est de manipuler jusqu'à la fin des nombres flottants pour conserver la précision des sin et cos.

    Et juste à la fin, lorsque tu veux dessiner ton bmp, tu mets les coordonnées de tes points à l'échelle de ton bmp, histoire d'avoir les nombres les plus grands possibles, et tu tronques pour avoir des entiers.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Autre problème
    Bonjour à vous

    Je trouve ce sujet très intéressant, mais si j'ai une rotation à effectuer non pas à partir du centre de gravité, mais depuis un des côtés du rectangle (côté A(xa,ya) de ABCD) est ce que cela marche? j'ai essayé mais mon rectangle se déforme légèrement ce qui a tendance a m'agacer légèrement aussi
    merci de votre aide
    hl² owns ... not yet!

  13. #13
    Rédacteur

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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    bien le bonjour

    théoriquement, la formule de rotation fonctionne à partir de n'importe quel point ( je parle de celle avec les nombres complexes).

    poste ton code.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 8
    Points : 6
    Points
    6
    Par défaut merci
    Merci ben c'est ce que je voulais savoir, donc visiblement l'erreur ne vient pas de là
    C'est interne à mon prog faut que je cherche
    merci pour ta réponse très rapide
    salut
    hl² owns ... not yet!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/12/2011, 13h47
  2. Réponses: 7
    Dernier message: 03/06/2010, 21h57
  3. [vb6] Rotation d'un rectangle
    Par Asdorve dans le forum Vos contributions VB6
    Réponses: 106
    Dernier message: 05/07/2006, 11h06
  4. Rotation d'un rectangle
    Par erwan.bodere dans le forum SDL
    Réponses: 4
    Dernier message: 02/12/2005, 21h19
  5. Rotation d'une cible autour du centre de l'écran
    Par kurul1 dans le forum C++Builder
    Réponses: 7
    Dernier message: 11/06/2005, 21h32

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