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

AWT/Swing Java Discussion :

Rotation d'un drawString


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 64
    Points : 36
    Points
    36
    Par défaut Rotation d'un drawString
    Bonsoir, excusez moi de vous déranger, je vous explique mon soucis:
    Alors voilà j'essaye d'écrire en biais un mot sans déplacer la position de mon drawString et de mon fillOval seulement sa ne fait pas ce que je veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                  g.rotate(100f);
    			g.translate(-POS_X - perso.getPosition(), -POS_Y + 30);
    			g.drawString(perso.getNom(), POS_X + perso.getPosition(), POS_Y - 30);
    			g.rotate(-100f);
    			g.translate(POS_X + perso.getPosition(), POS_Y - 30);
    			g.fillOval(perso.getPosition(), POS_Y - 50, 100, 100);
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tout ordre de transformée affine (comme les rotations, translations...) s'applique à l'ensemble des opérations qui suivent, y compris les autres transformées affines.

    Quand tu fais une translation après une rotation, la translation est fait dans un repère qui est "tourné" selon la rotation. Pour la rotation centrée, il existe également une méthode qui simplifie la combinaison des deux.

    Dans ton code, tu essaies de restituer la position précédente pour dessiner l'ovale, en tentant de faire les transformées affines inverses. Mais il faut le faire dans le sens inverse : si tu fais rotation 100, puis translation 10,10, il faut faire translation -10, -10, rotation -100.

    Le plus simple plutôt que de chercher à remettre le repère "à zéro" est soit :

    • de sauvegarde la transformée courante et de la restituer directement ensuite, respectivement, par getTransform() et setTransform()
    • soit de créer un nouveau contexte graphique et de lui appliquer les transformées, et de dessiner dedans. Ainsi, les transformées ne s'appliquent qu'à la partie du dessin que tu veux.


    Exemple avec sauvegarde :

    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
    @Override
    protected void paintComponent(Graphics g) {
       super.paintComponent(g);
     
       Graphics2D g2d = (Graphics2D) g;
     
       AffineTransform transform = g2d.getTransform(); // on sauvegarde la transformée courante
     
       String s = "TEXTE EN BIAIS";
       Rectangle2D stringBounds = g2d.getFontMetrics().getStringBounds(s, g);
     
       g2d.rotate(Math.PI/4, 100 + stringBounds.getCenterX(), 100 + stringBounds.getCenterY()); // rotation centrée sur le centre du textte
     
       g2d.setColor(Color.BLUE);
       g2d.drawString(s, 100, 100);
     
       g2d.setTransform(transform); // restitution de la transformée sauvegardée
     
       g.setColor(Color.RED);
       g.drawString(s, 100, 100);
     
       g.drawOval(100, 100-(int)g2d.getFontMetrics().getLineMetrics(s, g).getAscent(), (int)stringBounds.getWidth(), (int)stringBounds.getHeight()); // elliipse centrée sur le texte
     
    }
    Version avec création de contexte graphique
    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
    @Override
    protected void paintComponent(Graphics g) {
       super.paintComponent(g);
     
       Graphics2D g2d = (Graphics2D) g.create(); // on crée un nouveau contexte
     
       String s = "TEXTE EN BIAIS";
       Rectangle2D stringBounds = g2d.getFontMetrics().getStringBounds(s, g);
     
       g2d.rotate(Math.PI/4, 100 + stringBounds.getCenterX(), 100 + stringBounds.getCenterY()); // la rotation ne s'applique qu'à g2d, pas à g
     
       g2d.setColor(Color.BLUE);
       g2d.drawString(s, 100, 100);
     
       g2d.dispose(); // on libère le contexte graphique qu'on a créé
     
       g.setColor(Color.RED);
       g.drawString(s, 100, 100);
       g.drawOval(100, 100-(int)g2d.getFontMetrics().getLineMetrics(s, g).getAscent(), (int)stringBounds.getWidth(), (int)stringBounds.getHeight());
     
    }
    Ce qui donne ce résultat :
    Nom : Capture.PNG
Affichages : 430
Taille : 3,2 Ko
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 64
    Points : 36
    Points
    36
    Par défaut
    J'ai testé votre code qui est vraiment pas mal
    Mais moi, ça ne fait pas ce que je veux dans mon exemple, par rapport à mon drawString : ça se déplace de la position initiale.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu veux animer ton texte, qu'il se déplace d'une position à l'autre, c'est ça ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Problème de rotation
    Par Francky033 dans le forum DirectX
    Réponses: 1
    Dernier message: 17/07/2003, 16h38
  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