AffineTransform

Résolu
qhhu Messages postés 66 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 octobre 2009 - 18 juin 2006 à 13:55
qhhu Messages postés 66 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 octobre 2009 - 20 juin 2006 à 17:42
Bonjour !
J'ai un problème avec AffineTronsform.
Je voudrais qu'un objet Ellipse2D.Float tourne autour d'un point donné.
Chaque 10 dixièmes de secondes, il augmente d'un degré.
Le problème avec AffineTransform, c'est qu'au lieu de redessiner l'objet avec 1° de plus, il en dessine un nouveau!

Voici mon code:

import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
publicclass test extends JFrame{
    pupu p = new pupu();
   
        public test(){
            super("Test");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds( 800, 300,300, 300 );
            add(p);
            setVisible(true);
            while(true){
                p.addDegree();
                try{Thread.sleep(10);}catch(Exception e){}
            }
        }
  
    public static void main(String[] args){
        new test();
    }
   
   
}
class pupu extends JPanel{
    double deg = 0;
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g;
        Ellipse2D.Float ellipse = new Ellipse2D.Float(200f,200f,20f,70f);
        //g2.setColor(Color.red);
        AffineTransform at = new AffineTransform();
        at.rotate(Math.toRadians(deg),200f,200f);
        g2.fill(at.createTransformedShape(ellipse));
    }
    public void addDegree(){
        if(deg==360){
            deg=1;
        }
        deg++;
        repaint();
    }
}

Si qqn a une idée, je suis preneur!
Merci d'avance

6 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 juin 2006 à 09:46
Il te faut effacer l'arrière plan de ton Graphics avant de tracer de nouveau dessus.
Par contre, pour éviter tout scintillement désagréable, je te conseille également de passer par un double-buffering !

_
Avant de poster dans le forum,
prière d'aller lire ceci :
http://www.codes-sources.com/reglement.aspx
<s></s>
3
qhhu Messages postés 66 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 octobre 2009
19 juin 2006 à 14:16
Merci pour ta réponse mais je débute en Java2D...
Coment fait-tu pour effacer l'arrière plan d'un Graphics?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 juin 2006 à 14:28
Il te suffit de tracer un rectangle de la taille de ton graphics, ou alors directement appeller la fonction clearRect avec la taille de ton graphics.

_
Avant de poster dans le forum,
prière d'aller lire ceci :
http://www.codes-sources.com/reglement.aspx
<s></s>
0
qhhu Messages postés 66 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 octobre 2009
19 juin 2006 à 21:19
Merci bcp c'est exactement ce qu'il me fallait !
Cependant il me reste encore une question...
Moi, pour réduire le scintillement, j'utilise un tout bête
setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON)
mais il ne disparaît pas totalement.
Qu'entends tu par un double-buffering?
0

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

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
20 juin 2006 à 17:16
Tu confonds l'anti-aliasing avec le double-buffering apparement.

Le code que tu donne ici active l'anti-aliasing, c'est-à-dire le lissage des courbes (ce qui évite d'avoir le fameux effet escalier assez désagréable).

Le double-buffering n'a rien à voir : il s'agit d'une méthode permettant d'éviter un clignotement lorsque tu passe d'une image à une autre. Elle consiste à tracer la prochaine image (dans ton cas, ton elipse à une position différente) dans un buffer (une zone mémoire) qui ne sera affichée qu'une fois complètement tracée, du coup, tu n'a plus l'effet de scintillement.

Pour l'utiliser, c'est un peu plus compliqué (ca doit ressembler à un truc comme cà) :

public void paintComponent(Graphics g){
        Image i = (BufferedImage)       createImage(2000, 2000);
        Graphics buffer = i.getGraphics();
        Graphics2D g2 = (Graphics2D) buffer;
        Ellipse2D.Float ellipse = new Ellipse2D.Float(200f,200f,20f,70f);
        //g2.setColor(Color.red);
        AffineTransform at = new AffineTransform();
        at.rotate(Math.toRadians(deg),200f,200f);
        g2.fill(at.createTransformedShape(ellipse));
        g.drawImage(i, 0, 0, null);
    }

Sinon, plus simple (mais je n'ai jamais essayé) : active directement le doublebuffering du component qui trace ton elipse :
Component.setDoubleBuffered(true);

_
Avant de poster dans le forum,
prière d'aller lire ceci :
http://www.codes-sources.com/reglement.aspx
<s></s>
0
qhhu Messages postés 66 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 octobre 2009
20 juin 2006 à 17:42
Ok merci bcp pour toute ces réponses
0
Rejoignez-nous