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 :

drawString dans un Graphics2D mappé sur une pixelmap


Sujet :

2D Java

  1. #1
    Membre confirmé Avatar de loupapet
    Homme Profil pro
    Retraité d'Eurocopter
    Inscrit en
    Janvier 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité d'Eurocopter
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 69
    Par défaut drawString dans un Graphics2D mappé sur une pixelmap
    Bonjour à tous,

    Cela fait déjà plus de trois semaines (pas à plein temps tout de même !...) que mes recherches sur le sujet sont infructueuses. Je me décide donc à intervenir sur le forum car je suis un peu sec.

    Par loisir, je suis en train d'essayer de programmer une appliquette censée illustrer un propos sur les éditeurs de dessins techniques à l'issue de l'utilisation de "Inkscape" (Cliquez ici pour connaître le contexte si cela peut intéresser). L'appliquette est accessible à la fin de la page web mais peut être directement chargée ICI.

    Mon problème concerne l'utilisation de la méthode drawString utilisée dans un environnement Graphics2D plaqué sur une pixelmap pour des besoins d'affichage d'images.

    Dans une appliquette de test est reproduit le code source qui ne marche pas. Elle peut être lancée ICI avec :
    • le codage html de la page "Charw.html" :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      <html>
        <head>
          <title></title>
        </head>
        <body bgcolor="green" text="yellow">
            <h2 align="center">C'est chouette...</h2><hr />
            <p align="center">
               <applet code="Charw.class" width="640" height="480"/>
            <P>
        </body>
      </html>
    • le codage html de la page "Charw.html" :
      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
      import java.awt.* ;
      import java.awt.Event.* ;
      import java.awt.image.* ;
      import javax.swing.* ;
      import java.applet.* ;
      import java.util.* ;
      import java.awt.Font ;
      import java.lang.Math.* ;
      import java.io.*;
      import java.net.* ;
      import java.awt.geom.AffineTransform ;
       
      //=================================
      public class Charw extends Applet
      //=================================
      {
        static BufferedImage pixelmap ;               // référencement de la pixelmap
        static Graphics2D    g2d      ;               // référencement du graphique
       
        public void init ()
        {
       
          int larg_appl   = size().width  ;           // Récupération de la largeur
          int haut_appl   = size().height ;           // Récupération de la hauteur
       
          System.out.println ("Dimensions de l'appliquette="+larg_appl+" , "+haut_appl) ;
       
      // - On crée la pixelmap avec les dimension définies dans la page html
          pixelmap = new BufferedImage( larg_appl , haut_appl , BufferedImage.TYPE_INT_RGB ) ;
       
      // - on place le graphique sur la pixelmap
          g2d = (Graphics2D)pixelmap.getGraphics() ;
       
          g2d.setRenderingHint(  RenderingHints.KEY_ANTIALIASING
                               , RenderingHints.VALUE_ANTIALIAS_ON
                              ) ;
       
      // - On remplit la pixelmap d'un dégradé (noir-vert :
          for (int y = 0 ; y < haut_appl ; y++)
          { for (int x = 0 ; x < larg_appl ; x++)
            {
              int r = (int)(x * 100. / (double)(larg_appl)) ;      // calcul du Rouge
              int v = (int)(y * 100. / (double)(haut_appl)) ;      // calcul du Verte
              int b = 0 ;                                          //    pas de Bleu
       
              int c  = 255 << 24
                     |  r  << 16
                     |  v  <<  8
                     |  b ;
       
              pixelmap.setRGB( x , y , c );
            }
          }
       
      // - On encadre la pixelmap :
          g2d.setColor(new Color(255,255,255)) ;
          g2d.drawRect( 0 , 0 , larg_appl-1 , haut_appl-1 ) ;
       
      //=========================== texte 1 ==============================================================
       
          int x = 150 ; int y = 50 ; double angle = 30.0 ;     // position du texte et angle de rotation
       
          g2d.drawRect( x , y , 2 , 2 ) ;                      // on marque le pivot du texte à dessiner
       
          Font fnt = new Font ("Monospaced", Font.BOLD + Font.ITALIC, 15);
          g2d.setColor(new Color(60,200,200));
       
          AffineTransform transformation = new AffineTransform() ;
       
          transformation.setToTranslation( x , y) ;
          transformation.setToRotation(Math.toRadians(angle)) ;
          Font policeDerivee = fnt.deriveFont(transformation) ;
          g2d.setFont (policeDerivee);
       
          g2d.drawString ("J'ai des problèmes de rotation et de translation avec drawString !..."
                         , 0.0f,0.0f);
       
      //=========================== texte 2===============================================================
       
          x =  50 ; y = 150 ; angle = 15.0 ;                   // position du texte et angle de rotation
       
          g2d.setColor(new Color(255,255,255)) ;
          g2d.drawRect( x , y , 2 , 2 ) ;                      // on marque le pivot du texte à dessiner
       
          fnt = new Font ("Serif", Font.BOLD + Font.ITALIC, 15);
          g2d.setColor(new Color(128,255,0));
       
          transformation = new AffineTransform() ;
       
          transformation.setToRotation(Math.toRadians(angle)) ;
          transformation.setToTranslation( x , y) ;
          policeDerivee = fnt.deriveFont(transformation) ;
          g2d.setFont (policeDerivee);
       
          g2d.drawString ("J'ai des problèmes de rotation et de translation avec drawString !..."
                         , 0.0f,0.0f);
       
        }
       
        public void paint(Graphics g)         // point d'entrée standard
        {
          g.drawImage(pixelmap, 0, 0, null) ;
        }
      }

    Quand on permute les instructions 70-71, de même que les instructions 90-91, l'appliquette réagit comme si seules les instructions qui précèdent la 72 et la 92 étaient prises en compte.

    Pourtant, le code me paraît simple, mais Diable !..
    - quelle erreur suis-je en train de faire ?
    - que n'ai pas compris dans la doc d'Oracle ?

    En vous remerciant par avance.

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Bonjour

    Citation Envoyé par loupapet Voir le message
    Pourtant, le code me paraît simple, mais Diable !..
    - quelle erreur suis-je en train de faire ?
    - que n'ai pas compris dans la doc d'Oracle ?
    Ton erreur est d'avoir "mal lu" la doc Oracle... setToTranslation et setToRotation "définissent" la translation et la rotation... au sens on met tout à l'identité, et on met les bons coefs. Donc quand tu fais un appel à setToTranslation, il met les coefs de la translation dans la matrice, puis quand tu fais l'appel à setToRotation, il initialise la matrice à l'idendité, donc écrase la précédente translation, et met ensuite ceux de la rotation. Donc normal que tu ne récupère que l'effet de la ligne précédent ton deriveFont.

    Essaie en remplaçant, dans la seconde ligne de tes transformations, le "setTotranslation" par un "translate", et l'équivalent en rotations, "setToRotation" par un "rotate". Ca se combinera avec la première transformation. Attention à l'ordre translation<>rotation...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre confirmé Avatar de loupapet
    Homme Profil pro
    Retraité d'Eurocopter
    Inscrit en
    Janvier 2009
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité d'Eurocopter
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 69
    Par défaut Bonjour Plegat et merci ...
    Votre réponse m'a permis de corriger l'anomalie.

    En effet, le positionnement d'un texte dans l'espace graphique de mon appliquette de dessin technique fonctionne maintenant comme je le souhaitais. Je ne sais pas comment j'ai pu "me mélanger les pinceaux" de la sorte pour quelque chose d'aussi simple que je n'avais pas bien saisi et bien compris dans la doc. Mes essais avec "rotate" faisait basculer l’affichage graphique de l'appliquette tout entier.

    Grand merci, je vais pouvoir continuer l'écriture de l'option de création des textes.

    Le problème est donc considéré comme résolu, Merci encore.

    Bien cordialement.

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

Discussions similaires

  1. Fonction dans un evenement onclick sur une image
    Par SweetLeaf dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/07/2008, 11h23
  2. Réponses: 9
    Dernier message: 21/04/2008, 15h13
  3. Réponses: 1
    Dernier message: 06/02/2008, 04h03
  4. Réponses: 2
    Dernier message: 28/01/2008, 13h54
  5. Réponses: 4
    Dernier message: 13/08/2007, 17h13

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