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 :

Problème de combinaison de transformation avec AffineTransorm


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut Problème de combinaison de transformation avec AffineTransorm
    Salut à tous

    Je cherche à combiner une rotation et une translation d'une image et ça ne fonctionne pas comme je voudrais.

    Il s'agit de faire pivoter une image d'un angle alpha puis de la déplacer au point x,y.

    • Si j'applique la rotation seule, mon image a bien pivoté de l'ange alpha et l'axe de rotation est le point supérieur gauche de l'image elle s'affiche en haut à gauche de ma fenêtre (origine de ma fenêtre)
    • Si j'applique la translation seule l'image s'affiche bien au point x,y (le coin supérieur gauche de l'image est au point x,y)
    • Par contre si je combine les 2 transformations j'ai bien une rotation mais la translation est fausse.


    Voici le code

    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
     
    double alpha=Math.PI/6;
    double x=250;
    double y=120;
    File file = new File("Graph/Inf.bmp");
    BufferedImage image;
    try {
    	image = javax.imageio.ImageIO.read(file);
    	at=AffineTransform.getRotateInstance(alpha);
    	at.concatenate(AffineTransform.getTranslateInstance(x,y));
    	g2.drawRenderedImage(image, at);			
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    Si quelqu'un peut m'expliquer où est l'erreur

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Bonjour,
    Je n'ai pas testé mais le problème vient certainement du fait que la translation en X et Y se fait dans le nouveau repère, c'est à dire après la rotation alors que toi tu veux une translation de (x,y) dans le repère d'origine.

    Tu imagines ton repère initiale (Appelons le A) l'origine (0,0) en haut à gauche.

    Tu lui appliques d'abord une rotation de PI/6 l'origine est alors au même endroit mais l'axe Ox est maintenant décalé vers le bas de PI/6 Appelons ce nouveau repère B.

    Tu appliques ensuite une translation du vecteur (x,y) dans le repère B dont les axes Ox et Oy ont déjà tourné.

    Donc si je ne me trompe pas sur l'origine de ton erreur essaies une translation de X' = x*cos(PI/6) + y*sin(PI/6) et Y' = -x*sin(PI/6) + y*cos(PI/6)

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Re bonjour,
    ou alors tu fais d'abord ta translation puis ta rotation

  4. #4
    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
    Salut,

    Citation Envoyé par ludomacho Voir le message
    ou alors tu fais d'abord ta translation puis ta rotation
    Pas testé non plus, mais d'après la doc, j'ai l'impression que c'est ce que fait déjà Gouyon!
    Donc soit inverser l'ordre des transformations pour le concatenate, soit garder cet ordre mais en remplaçant le concatenate par un preConcatenate (à tester, je n'ai pas l'habitude d'utiliser les AffineTransform)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Bonjour,

    Voici un petit programme fonctionnel qui va m'aider à expliquer :


    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
     
    import javax.swing.*;
    import java.awt.geom.*;
    import java.awt.*;
     
    public class TestAffin extends JPanel {
     
    	double alpha=Math.PI/6;
    	double x=250;
    	double y=120;
     
    	public static void main(String[] args) {
    		JFrame f =new JFrame();
    		f.setSize(500,500);
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.add(new TestAffin());
    		f.setVisible(true);
    	}
     
    	public TestAffin() {
     
    	}
     
    	public void paintComponent(Graphics g) {
    		Graphics2D g2 = (Graphics2D) g.create();
    		g2.setBackground(Color.white);
    		g2.clearRect(0,0,500,500);
    		//tracer d'un repere d'un rectangle à l'origine du repere et du point x,y en noir
    		g2.drawLine(0,0,500,0);
    		g2.drawLine(0,0,0,500);
    		g2.drawRect(0,0,100,75);
    		g2.fillOval((int)(x-2),(int)(y-2),5,5);
    		//rotation d'angle alpha et meme trace que precedemment en rouge
    		AffineTransform at=AffineTransform.getRotateInstance(alpha);
    		g2.setColor(Color.red);
    		g2.setTransform(at);
    		g2.drawLine(0,0,500,0);
    		g2.drawLine(0,0,0,500);
    		g2.drawRect(0,0,100,75);
    		g2.fillOval((int)(x-2),(int)(y-2),5,5);
    		// Ajout d'une translation de x,y et tracé comme precedemment en bleu
    		at.concatenate(AffineTransform.getTranslateInstance(x,y));
    		g2.setColor(Color.blue);
    		g2.setTransform(at);
    		g2.drawLine(0,0,500,0);
    		g2.drawLine(0,0,0,500);
    		g2.drawRect(0,0,100,75);
    		g2.fillOval((int)(x-2),(int)(y-2),5,5);
    		//la meme chose en inversant l'ordre
    		AffineTransform at2=AffineTransform.getTranslateInstance(x,y);
    		at2.concatenate(AffineTransform.getRotateInstance(alpha));
    		g2.setColor(Color.green);
    		g2.setTransform(at2);
    		g2.drawLine(0,0,500,0);
    		g2.drawLine(0,0,0,500);
    		g2.drawRect(0,0,100,75);
    		g2.fillOval((int)(x-2),(int)(y-2),5,5);
    	}
    }
    Dans chaque couleur je trace le repère, un rectangle (représentant l'image et le point de coordonnées x,y.

    Le point noir a pour coordonnées x,y.

    Le point rouge est l'image du point noir par la rotation d'angle PI/6.

    On a donc bien d'abord la translation qui s'effectue et ensuite la rotation bien qu'on l'écrive dans l'autre sens.

    Donc soit on inverse l'ordre des transformations comme ici en vert ou on change la translation comme suggéré dans le précédent message.

  6. #6
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    Merci pour vos réponse.
    Je viens de tester la solution de ludomacho et ça marche. La translation se fait bien par rapport au nouveau repère qui a tourné de l'angle alpha.
    Si j'inverse translation et rotation ça marche bien aussi.
    Pour résumer la translation et la rotation en fait modifient le repère pour ma part je pensait que les transformations ne s'appliquait qu'à l'objet.

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

Discussions similaires

  1. [Excel 2010] Projet perso, problème de combinaison avec listes.
    Par MoneyCivius dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/04/2014, 15h00
  2. [ctypes]Problème pour simuler une combinaison de touche avec ctypes
    Par Estudiante dans le forum Interfaçage autre langage
    Réponses: 0
    Dernier message: 29/09/2009, 17h46
  3. Problème sur classe Transformer avec les <!--
    Par tykool dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 10h20
  4. Réponses: 3
    Dernier message: 18/11/2002, 16h36
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

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