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

2D Java Discussion :

rotate() de Graphics2D


Sujet :

2D Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut rotate() de Graphics2D
    Bonjour, j'ai un problème pour tourner un rectangle. Le problème c'est que je ne sais pas comment lui dire de tourner juste le rectangle. Je dessine le rectangle avec Graphics. Quand j'applique ce qui suit, c'est tout mon panel qui se met à tourner, logique, il ne sait pas que c'est juste le rectangle qui doit tourner.
    Graphics g;
    Graphics2D g2 = (Graphics2D) g;
    g2.rotate();

  2. #2
    Membre confirmé Avatar de zoullou
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Par défaut
    Regarde du coté de la classe Area.

    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 18
    Par défaut
    Essaye avec un AffineTransform :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AffineTransform saveAT = g2.getTransform();
    g2.rotate();
    g2.setTransform(saveAT);

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    J'essaye mais ça marche pas. Tout tourne en même temps autour d'un seul centre.

    Voici un exemple avec deux rectangles. Je voudrais en faire tourner qu'un mais j'arrive pas.

    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
     
        public double a = 0.0;
     
        public void paint(Graphics g)
        {        
            Graphics2D g2 = (Graphics2D) g;
     
            a += 60;
     
            if (a == 360)
            {
                a = 0;
            }
     
            AffineTransform at = new AffineTransform();
            at.rotate(a);
            g2.setTransform(at);
     
            Rectangle rect = new Rectangle(30, 30, 30, 30);
            g2.draw(rect);
     
            at = new AffineTransform();
            at.rotate(0);
            Rectangle rect2 = new Rectangle(40, 40, 40, 40);
            g2.draw(rect2);  // g2.draw(r2);
     
    ...

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    alors :

    1) les angles sont en radians la plupart du temps (avec un tour complet = 2*Math.PI radians donc). Il n'a y a guere que Arc2D et drawArc() qui utilisent des degrees je crois.

    2) Une broutille mais tu peux simplifier ton code en utilisant l'operateur modulo.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a += 60;
    if (a == 360)
    {
      a = 0;
    }
    =>
    3) une fois que tu as fais une rotation, il te faut faire la rotation inverse.

    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
    try {
      AffineTransform at = AffineTransform.getRotateInstance(a);
      g2.setTransform(at);
      Rectangle rect = new Rectangle(30, 30, 30, 30);
      g2.draw(rect);
      g2.setTransform(at.createInverse());
      // ou :
     //g2.setTransform(AffineTransform.getRotateInstance(-a));
     // pour eviter de devoir mettre un try{...} catch {...}
      Rectangle rect2 = new Rectangle(40, 40, 40, 40);
      g2.draw(rect2); 
    }
    catch (Exception e) {
      ...
    }
    ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      g2.rotate(a);
      Rectangle rect = new Rectangle(30, 30, 30, 30);
      g2.draw(rect);
      g2.rotate(-a);
      Rectangle rect2 = new Rectangle(40, 40, 40, 40);
      g2.draw(rect2);
    4) mais c'est moins grave, la balise c'est [ code ] pas < code >
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Le rectangle tourne autour du centre (0, 0) (voir code). Alors que je voudrais qu'il tourne juste autour de son centre et j'arrive pas, je sens que je m'y approche.

    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
     
            Graphics2D g2 = (Graphics2D) g;
     
            a += 2;
            a %= 360;
     
            try
            {
                AffineTransform at = new AffineTransform();
                at.rotate(Math.toRadians(a));
                g2.setTransform(at);
     
                //g2.rotate(Math.toRadians(a));
                Rectangle rect = new Rectangle(200, 50, 60, 35);
                g2.draw(rect);
                Thread.sleep(100);
                g2.rotate(Math.toRadians(-a));
                Rectangle rect2 = new Rectangle(40, 40, 40, 40);
                g2.draw(rect2); 
            }
            catch (InterruptedException ex) { }

  7. #7
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Alors pour faire une rotation autour d'un point précis, tu peux tenter d'utiliser g.rotate(angle, x, y); mais je me souviens que j'y étais pas arrivé.

    Ce que j'utilise (x et y sont les coordonnées du centre de la rotation) :
    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
    Graphics2D g;
     
    // dessiner ce qui reste droit
    // en arrière plan
     
    g.translate(x, y);
    g.rotate(a);
    g.translate(-x, -y);
     
    // dessiner ce qui doit tourner
     
    g.translate(x, y);
    g.rotate(-a);
    g.translate(-x, -y);
     
    // dessiner ce qui reste droit
    // au premier plan
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Tout à l'air de marcher mais le rectangle reste en arrière plan. Comment je peux remédier celà facilement. Car pour l'instant le rectangle 1 tourne mais en arrière plan et le deuxième ne tourne pas. Ce que je voulez d'ailleurs.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Finalement, plus de problème. Je sais pas pourquoi mais c'est revenu à la normal et comme je voulais.

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par DefmY
    Le rectangle tourne autour du centre (0, 0) (voir code). Alors que je voudrais qu'il tourne juste autour de son centre et j'arrive pas,
    Faudrai etre plus precis dans le descriptif du pb alors ! =>
    Citation Envoyé par DefmY
    Je voudrais en faire tourner qu'un mais j'arrive pas.
    Citation Envoyé par DefmY
    Car pour l'instant le rectangle 1 tourne mais en arrière plan et le deuxième ne tourne pas.
    S'il est dessine en premier c'est normal. Et tu as dis toi-meme que tu ne voulais pas que le 2nd tourne...

    M'enfin sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AffineTransform at = AffineTransform.getRotateInstance(a, x, y);
    Rectangle r1 = new Rectangle(....);
    Shape s = at.createTransformedShape(r1);
    graphics.draw(s);
    avec x, y le centre de rotation.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. [Graphics2D] Rotation d'images
    Par MrEddy dans le forum 2D
    Réponses: 3
    Dernier message: 17/01/2007, 13h29
  2. Rotation de Bitmap -> ScanLine
    Par jujuesteban dans le forum Langage
    Réponses: 7
    Dernier message: 03/07/2003, 15h11
  3. Rotation d'un bouton ?
    Par ken_survivant dans le forum Composants
    Réponses: 3
    Dernier message: 01/04/2003, 18h16
  4. matrice et rotation
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 07/12/2002, 17h59
  5. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 22h58

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