Sens trigo avec échelle négative en Y

dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012 - 9 févr. 2011 à 19:01
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012 - 25 févr. 2011 à 07:03
Bonjour à tous,

Avec "Graphics2D" le repère est en haut à gauche, je le déplace en bas à gauche comme ceci :
        
        g2c.translate(margeX,canvas1.getHeight()-(margeY));// deplacement en X et Y de la marge
        g2c.scale(zoom,-zoom);// echelle 1 en x et -1 en y pour retourner le dessin et mettre l'origine en bas a gauche
        g2c.setStroke(new BasicStroke(1/zoom));// remettre la largeur du trace a 1
        FontDessin = new Font("Dialog", Font.PLAIN, 17/(int)zoom);// remettre le size du texte a 17
        g2c.setFont(FontDessin);

ensuite pour tracer mes segments et textes je fais :
maligne=new Line2D.Float(Xdeb,Ydeb,Xfi,Yfi); g2c.draw(maligne);
monCercle=new Ellipse2D.Float(Xhaut,Yhaut,largeur,hauteur); g2c.draw(monCercle);
monArc=new Arc2D.Float(Xhaut,Yhaut,largeur,hauteur,(float)angleDebut,(float)angleFin,0); g2c.draw(monArc);
g2c.drawString(TexteInfo,(int)Xdeb, (int)Ydeb);

Mon problème :
monArc n'est pas sens trigo (j'ai les 3/4 du cercle au lieu du 1/4)
mon texte est à l'envers
vous me direz "normal tu as mis g2c.scale(zoom,-zoom);"
Ok ! mais avez-vous une idée remédier à ce problème !?

Merci pour votre aide éventuelle,

DMF

14 réponses

dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
11 févr. 2011 à 17:19
Bonjour à tous,

Pour l'Arc2D, j'ai trouvé :
il suffit d'inverser les coordonnées du point de départ avec celles du point d'arrivée.

J'ai toujours le problème du Texte en Négatif vertical
et l'échelle du texte que je n'arrive pas à inverser ?

Amicalement,
DMF
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
11 févr. 2011 à 17:47
Re,

pour l'échelle du texte, j'ai trouvé :
FontDessin = font.deriveFont(17/zoom);

par contre, je cherche pour remettre le texte dans le bon sens ??

une idée ?

DMF
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
11 févr. 2011 à 18:57
Re,

je pensai qu'avec affinetransform je pourrai inverser mon texte !
mais pas de résultat :(
Mon code au cas ou j'aurai fait une erreur :
        
FontDessin = font.deriveFont(17/zoom);
AffineTransform atFont = new AffineTransform();
atFont.scale(1, -1);
FontDessin.deriveFont(atFont);
g2c.setFont(FontDessin);
g2c.drawString(TexteInfo,(int)Xdeb, (int)Ydeb);


:(
DMF
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
17 févr. 2011 à 09:11
Bonjour à tous,

un petit Up !
c'est mon birthday !

DMF
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
21 févr. 2011 à 15:41
Bonjour à tous,

Personne n'a une petite idée pour remettre mon texte à l'endroit ?

:(

DMF
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
21 févr. 2011 à 17:12
Salut,

Je n'ai pas trop l'habitude de travailler avec les transformations affines mais pourquoi ne pas appliquer la transformation affine sur chaque élément séparément :

1) Calcule ta transformation affine
2) Modifie tous les Shape qui doivent subir cette transformation avant de les dessiner :
courbe = transformationAffine.createTransformedShape(courbe);
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
22 févr. 2011 à 16:52
Bonjour Jonathan,

1) je calcul ma transformation -> ok
2) je mofifie tous les shapes -> ok
3) mon drawString n'est pas un shape et si il ne prend
pas la transformation, il se retrouvera inversé au niveau
des coordonnées en Y à l'affichage, non ?

Amicalement,

DMF
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
22 févr. 2011 à 17:25
Re,

Décidément, je crois que l'exemple est encore le meilleur outil de communication ;)

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 
 * @author guehenneux
 * 
 */
public class TestAffine extends JFrame {

/**
 * 
 * @author guehenneux
 * 
 */
private class Panneau extends JPanel {

@Override
protected void paintComponent(Graphics graphics) {

Graphics2D graphique = (Graphics2D) graphics;

/*
 * une grande ligne
 */

Shape forme0 = new Line2D.Double(100, 100, 500, 500);

/*
 * une petite ligne
 */

Shape forme1 = new Line2D.Double(100, 300, 300, 100);

/*
 * transformation affine destinee a renverser le dessin
 * verticalement (axe y vers le haut)
 */

AffineTransform transformationAffine = new AffineTransform();
transformationAffine.translate(0, getHeight());
transformationAffine.scale(1, -1);

/*
 * on l'applique sur les formes
 */

forme0 = transformationAffine.createTransformedShape(forme0);
forme1 = transformationAffine.createTransformedShape(forme1);

/*
 * on dessine
 */

graphique.draw(forme0);
graphique.draw(forme1);

graphique
.drawString(
"Ce texte n'est pas influencé par la transormation affine.",
50, 50);

}

}

/**
 * 
 */
public TestAffine() {

super("Test affine");

setSize(600, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);

Panneau panneau = new Panneau();
add(panneau);

setVisible(true);

}

/**
 * 
 * @param args
 */
public static void main(String[] args) {
new TestAffine();
}

}
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
23 févr. 2011 à 08:48
Bonjour Jonathan,

Je te remercie pour ton exemple,
mais c'est bien ce que je disais :
les lignes ont une ordonnée négative par rapport à leurs coordonnées
mais les textes ont une ordonnée positive par rapport à leurs coordonnées !
ce qui me fais 2 systèmes d'axes de coordonnées.

une idée me vient mais je ne sais pas si cela fonctionnera :

- créer la transformation pour tous les shapes
- créer un shape d'une ligne (sans la tracer) ayant les coordonnées
début,fin de la position du texte, donc les coordonnées subiront la transformation.
- faire le drawString en récupérant le getX et getY de cette fausse ligne.

c'est peut-être jouable, non ?

Amicalement,

DMF
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
23 févr. 2011 à 09:28
Salut,

Je crois que j'ai compris ton problème. Dans ce cas, oui il me semble que ton idée est bonne.
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
24 févr. 2011 à 07:09
Bonjour,

J'ai une erreur : java.lang.ClassCastException: java.awt.geom.GeneralPath
je n'utilise pas "GeneralPath" dans mon code !?
le nouveau code ne m'affiche pas toutes mes ligne ?
parce que je passe par une boucle ?
mon code :
        AffineTransform atDessin = new AffineTransform();
        atDessin.translate(margeX,canvas1.getHeight()-(margeY));
        atDessin.scale(zoom,-zoom);
        g2c.setFont(FontDessin);
         String ligne = buf.readLine();
         ListModel = new DefaultListModel();
         num=0;
        while (ligne!=null){
          if (ligne.length()>=2){
             String deb = ligne.substring(0 ,4);
                  if (deb.equals("lig,")) {
                    String[] c = ligne.split(",");
                    style c[0]; couleur c[1]; Xdebut = c[2]; Ydebut = c[3]; Xfin = c[4]; Yfin = c[5];
                    Xdeb fpf(Xdebut); Ydeb fpf(Ydebut); Xfi = fpf(Xfin); Yfi = fpf(Yfin);
                         if (couleur.equals("1")){g2c.setColor(Color.red);}
                    else if (couleur.equals("2")){g2c.setColor(Color.blue);}
                    else if (couleur.equals("3")){g2c.setColor(Color.ORANGE.darker());}
                    else if (couleur.equals("4")){g2c.setColor(Color.MAGENTA);}
                    else if (couleur.equals("5")){g2c.setColor(Color.cyan.darker());}
                    else if (couleur.equals("6")){g2c.setColor(Color.ORANGE);}
                    else if (couleur.equals("7")){g2c.setColor(Color.GREEN.darker());}
                    else {g2c.setColor(Color.BLACK);}
                    if (jCheckBoxNumLigne.isSelected()){Calcul.calculAngleLigne();}
                        maligne=new Line2D.Float(Xdeb,Ydeb,Xfi,Yfi);
                        maligne=atDessin.createTransformedShape(maligne);
                        g2c.draw(maligne);
                  }

                  if (deb.equals("arc,")) {
                    String[] c = ligne.split(",");
                    style c[0]; couleur c[1]; Xdebut = c[2]; Ydebut = c[3]; Xfin = c[4]; Yfin = c[5]; Xcentre = c[6]; Ycentre = c[7];
                    Xfi fpf(Xdebut); Yfi fpf(Ydebut); Xdeb = fpf(Xfin); Ydeb = fpf(Yfin); Xcen = fpf(Xcentre); Ycen = fpf(Ycentre);// debut et fin inverses pour y neg
                    rayon=(float) Math.sqrt(((Xcen-Xdeb)*(Xcen-Xdeb))+((Ycen-Ydeb)*(Ycen-Ydeb)));
                    Xhaut=Xcen-(float)rayon; Yhaut=Ycen-(float)rayon;
                    largeur=(float)rayon*2;hauteur=(float)rayon*2;
                         if (couleur.equals("1")){g2c.setColor(Color.red);}
                    else if (couleur.equals("2")){g2c.setColor(Color.blue);}
                    else if (couleur.equals("3")){g2c.setColor(Color.ORANGE.darker());}
                    else if (couleur.equals("4")){g2c.setColor(Color.MAGENTA);}
                    else if (couleur.equals("5")){g2c.setColor(Color.cyan.darker());}
                    else if (couleur.equals("6")){g2c.setColor(Color.ORANGE);}
                    else if (couleur.equals("7")){g2c.setColor(Color.GREEN.darker());}
                    else {g2c.setColor(Color.BLACK);}
                 if (jCheckBoxNumLigne.isSelected()){Calcul.calculAngleLigne();}
                    Calcul.calculAngleArc();
                      if ((Xdeb==Xfi) && (Ydeb==Yfi)){// si un cercle
                        monCercle=new Ellipse2D.Float(Xhaut,Yhaut,largeur,hauteur);
                        monCercle=(RectangularShape) atDessin.createTransformedShape(monCercle);
                        g2c.draw(monCercle);
                      }
                      else {// si un arc
                       monArc=new Arc2D.Float(Xhaut,Yhaut,largeur,hauteur,(float)angleDebut,(float)angleFin,0);
                       monArc=(RectangularShape) atDessin.createTransformedShape(monArc);
                       g2c.draw(monArc);
                      }
                  }

                   if (deb.equals("cot,")) {
                    String[] c = ligne.split(",");
                    style c[0]; couleur c[1]; Xdebut = c[2]; Ydebut = c[3]; Xfin = c[4]; Yfin = c[5]; Xcentre = c[6]; Ycentre = c[7];TexteCotation = c[8];
                    Xdeb fpf(Xdebut); Ydeb fpf(Ydebut); Xfi = fpf(Xfin); Yfi = fpf(Yfin); Xcen = fpf(Xcentre); Ycen = fpf(Ycentre);
                       if (jCheckBoxNumLigne.isSelected()==true){}
                       if (VoirCotations.isSelected()==true) {
                            g2c.setColor(Color.GREEN.darker());
                            maCotation=new Line2D.Float(Xdeb,Ydeb,Xfi,Yfi);
                            maCotation=atDessin.createTransformedShape(maCotation);
                            g2c.draw(maCotation);
                            Line2D maLigneFictiveCotation=new Line2D.Float(Xcen, Ycen, Xcen, Ycen);
                            maLigneFictiveCotation=(Line2D) atDessin.createTransformedShape(maLigneFictiveCotation);
                            g2c.drawString(TexteCotation,(int)maLigneFictiveCotation.getX1(), (int)maLigneFictiveCotation.getY1());
                     }
                  }

                  if (deb.equals("tex,")) {
                    String[] c = ligne.split(",");
                    style c[0]; couleur c[1]; Xdebut = c[2]; Ydebut = c[3];Xfin = c[4]; Yfin = c[5]; TexteInfo = c[6];
                    Xdeb fpf(Xdebut); Ydeb fpf(Ydebut);
                       if (jCheckBoxNumLigne.isSelected()){}
                       else {
                            g2c.setColor(Color.GREEN.darker());
                            Line2D maLigneFictiveTexte=new Line2D.Float(Xdeb, Ydeb, Xdeb, Ydeb);
                            maLigneFictiveTexte=(Line2D) atDessin.createTransformedShape(maLigneFictiveTexte);
                            g2c.drawString(TexteInfo,(int)maLigneFictiveTexte.getX1(), (int)maLigneFictiveTexte.getY1());
                        }
                  }

            num++;

           ListModel.addElement(""+num);

              jListLignes.setModel(ListModel);

           if (jCheckBoxNumLigne.isSelected()){numLigne.numLigne();}

              jComboBoxLigne1.addItem(""+num);
              jComboBoxLigne2.addItem(""+num);
              jComboBoxLigne3.addItem(""+num);
              jComboBoxLigne4.addItem(""+num);

          }
        ligne = buf.readLine();
      }

    buf.close();

    g2c.dispose();


une idée ?

Amicalement,

DMF
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
24 févr. 2011 à 09:34
Salut,

La StackTrace de l'exception en entier nous serait très utile.
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
24 févr. 2011 à 18:21
Bonjour Jonathan,

La StackTrace :
java.lang.ClassCastException: java.awt.geom.GeneralPath
        at bru001.form1.VoirCotationsActionPerformed(form1.java:5569)
        at bru001.form1.actionPerformed(form1.java:2943)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1882)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2202)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
        at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:269)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:246)
        at java.awt.Component.processMouseEvent(Component.java:5602)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3129)
        at java.awt.Component.processEvent(Component.java:5367)
        at java.awt.Container.processEvent(Container.java:2010)
        at java.awt.Component.dispatchEventImpl(Component.java:4068)
        at java.awt.Container.dispatchEventImpl(Container.java:2068)
        at java.awt.Component.dispatchEvent(Component.java:3903)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4256)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3936)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3866)
        at java.awt.Container.dispatchEventImpl(Container.java:2054)
        at java.awt.Window.dispatchEventImpl(Window.java:1801)
        at java.awt.Component.dispatchEvent(Component.java:3903)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)


je ne vois pas ? :(

DMF
0
dmfdmf Messages postés 38 Date d'inscription mardi 10 novembre 2009 Statut Membre Dernière intervention 15 avril 2012
25 févr. 2011 à 07:03
Bonjour à tous,

Trouvé !!! :-)

        g2c.translate(margeX,canvas1.getHeight()-(margeY));
        g2c.scale(zoom,-zoom);
        g2c.setStroke(new BasicStroke(1/zoom));

        Font fontDessin = new Font("Dialog", Font.PLAIN, 17);
        //fontDessin = font.deriveFont(17/zoom);// bug d'affichage en zoom
        AffineTransform atFont = new AffineTransform();
        atFont.setToScale(1,-1);
        Font fontMiroir = fontDessin.deriveFont(atFont);
        g2c.setFont(fontMiroir);


Par contre, j'ai un bug à l'affichage du texte dès que je zoom ?!

Amicalement,
DMF
0
Rejoignez-nous