AffineTransform [Résolu]

qhhu 67 Messages postés vendredi 16 décembre 2005Date d'inscription 21 octobre 2009 Dernière intervention - 18 juin 2006 à 13:55 - Dernière réponse : qhhu 67 Messages postés vendredi 16 décembre 2005Date d'inscription 21 octobre 2009 Dernière intervention
- 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
Afficher la suite 

6 réponses

Répondre au sujet
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 19 juin 2006 à 09:46
+3
Utile
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>
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_DARKSIDIOUS
qhhu 67 Messages postés vendredi 16 décembre 2005Date d'inscription 21 octobre 2009 Dernière intervention - 19 juin 2006 à 14:16
0
Utile
Merci pour ta réponse mais je débute en Java2D...
Coment fait-tu pour effacer l'arrière plan d'un Graphics?
Commenter la réponse de qhhu
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 19 juin 2006 à 14:28
0
Utile
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>
Commenter la réponse de cs_DARKSIDIOUS
qhhu 67 Messages postés vendredi 16 décembre 2005Date d'inscription 21 octobre 2009 Dernière intervention - 19 juin 2006 à 21:19
0
Utile
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?
Commenter la réponse de qhhu
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 20 juin 2006 à 17:16
0
Utile
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>
Commenter la réponse de cs_DARKSIDIOUS
qhhu 67 Messages postés vendredi 16 décembre 2005Date d'inscription 21 octobre 2009 Dernière intervention - 20 juin 2006 à 17:42
0
Utile
Ok merci bcp pour toute ces réponses
Commenter la réponse de qhhu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.