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 :

Java2D: Rotation d'un cercle et pb de dimensions


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut Java2D: Rotation d'un cercle et pb de dimensions
    Bonjour,

    J'essaie de faire une rotation d'un cercle par rapport à son centre à l'aide de la classe AffineTransform:

    Cercle de départ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ellipse2D.Double circle = new Ellipse2D.Double(10, 10, 350, 350);
    Rotation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // rotation par rapport au centre
    AffineTransform xform = new AffineTransform();
    xform.setToRotation(0.3, circle.getCenterX(), circle.getCenterY());
    //Récupération de la nouvelle shape
    Path2D.Double nshape = (Path2D.Double)xform.createTransformedShape(circle);

    Le problème est que width et heigth de circle.getBounds2D() et nshape.getBounds2D() sont différents (ie xxx.getBounds2D().getWidth() et xxx.getBounds2D().getHeight()).

    Sauriez-vous pourquoi ? je n'ai effectué que la rotation du cercle par rapport au centre ...

    Merci d'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
    Salut

    Citation Envoyé par valouee Voir le message
    Sauriez-vous pourquoi ? je n'ai effectué que la rotation du cercle par rapport au centre ...
    A tout hasard, je dirais que ça te sort les hauteur/largeur du rectangle englobant le rectangle contenant ton cercle après rotation... et que donc c'est plus grand que ton cercle.

    Regarde pour voir si la hauteur/largeur ne correspondrait pas à un 2*D*(sin(thêta)+cos(thêta)) avec D diamètre, thêta angle de rotation
    Si oui, ça vient de là

    [edit] apparemment, c'est pas ça...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    pour moi c'est un bug dans Path2D/Shape, ou plutôt une mauvaise implémentation de getBounds2D() car la doc dit bien que la précision n'est pas forcément correcte, le seul contrat est que la forme englobante est "supérieure", dans le sens : n'intersecte pas avec la forme originale.

    A noter que getBounds2D() retourne la AABB (la boîte alignée sur les axes du repère global) ainsi avec l'exemple suivant :

    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
            Graphics2D g2 = (Graphics2D) g;
            Ellipse2D.Double circle = new Ellipse2D.Double(100, 100, 100, 350);
     
            g.setColor(Color.RED);
            g2.draw(circle);
            g2.draw(circle.getBounds2D());
     
            g2.rotate(0.3, circle.getCenterX(), circle.getCenterY());
            g.setColor(Color.YELLOW);
            g2.draw(circle);
            g2.draw(circle.getBounds2D());
            g2.rotate(-0.3, circle.getCenterX(), circle.getCenterY());
     
            // rotation par rapport au centre
            AffineTransform xform = new AffineTransform();
            xform.setToRotation(Math.toRadians(45), circle.getCenterX(), circle.getCenterY());
            // Récupération de la nouvelle shape
            Path2D.Double nshape = (Path2D.Double) xform.createTransformedShape(circle);
     
            g.setColor(Color.GREEN);
            g2.draw(nshape);
            g2.draw(nshape.getBounds2D());


    on peut voir que la dernière boîte, la verte, est l'AABB. Dans tous les cas ça n'explique pas l'espace entre la forme et la boîte, qui est d'ailleurs lié à l'angle de rotation. Si quelqu'un a des infos

    Dans ton cas, tu devrais peut-être plutôt utiliser les méthodes de transformation de Graphic2D.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Il faudrait peut-être aller demander dans les forums officiels d'Oracle (http://forums.oracle.com/forums/forum.jspa?forumID=938) ou remplir un rapport de bug (http://bugs.sun.com/).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut
    Bonjour à tous,

    Merci pour vos réponse.
    Vous confirmez ce que je pensais. Ca semble être un bug java, qui est en attente d'amélioration (bug 4172661). Les rotations par Graphics marchent bien (l"exemple de code le montre bien), le cadre est bien collé au cercle, mais les rotations issues de AffineTransform modifient la taille du cadre. Et lorsqu'on a du code qui se base sur ce cadre, c'est gênant. Attendons donc que ce bug soit corrigé.
    Merci à tous.

Discussions similaires

  1. Rotation d'un cercle sur ses 3 axes
    Par neon29200 dans le forum Mathématiques
    Réponses: 3
    Dernier message: 07/04/2014, 04h44
  2. Problem Avec Java2D rotate() et translate()
    Par marshallMe dans le forum 2D
    Réponses: 2
    Dernier message: 06/08/2010, 17h31
  3. rotation d'un cercle
    Par mendezino dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/04/2009, 17h16
  4. rotation d'un cercle
    Par dany83 dans le forum C++Builder
    Réponses: 3
    Dernier message: 03/06/2007, 17h07
  5. [JAVA2D] Rotation d'une image
    Par narmataru dans le forum 2D
    Réponses: 11
    Dernier message: 12/09/2006, 09h57

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