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 :

Changement de repère


Sujet :

2D Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut Changement de repère
    Bonjour,
    voici mon problème. Etant donné un JPanel, un contexte graphique y est attaché. Quand on appelle par exemple g.drawLine(a,b,c,d) une ligne est dessinée en utilisant des coordonnées bien précises. Mon but est de trouver un moyen de changer de repère de telle manière que quand j'appelle g.drawline(a,b,c,d) la ligne se dessinne mais en utilisant le repère que j'aurai indiqué (par l'intermédiaire de coordonnées extrêmes correspondantes aux bords de mon JPanel, par exemple).
    Pour ceci j'ai plusieurs solutions plus ou moins jolies.
    L'une d'elles est l'idée de créer une sous classe de Graphics2D et de redéfinir drawline, (et d'autres bien sûr) en tenant compte de mes nouvelles coordonnées. Est-ce une bonne idée ? Y a-t-il un manière canonique de procéder à ce genre de chose qui me semble hyper classique ?
    Autre idée :
    J'ai utilisé les méthodes translate(), scale() mais cette dernière ne donne pas satisfaction. En effet le problème est que si les extrêmités des abscisses (par exemple) sont 0 et 1 je ne peux pas écrire drawLine(0.2, 0.3,...,...) car elle n'accepte que des types int. D'ailleurs, soit dit en passant, je ne comprends pas l'intérêt de cette fonction scale().
    C'est dommage car il me semblait qu'utiliser translate et scale était la solution la plus jolie.
    Le problème de la sous classe de Graphics2D est que cette dernière est abstraite et creer un sous classe nécessite de tout redéfinir. Je n'arrive pas à m'en sortir.
    J'ai bien une dernière solution, mais plutot moche : elle consiste à créer une classe qui définit des méthodes qui transforment des coordonnées d'un point dans un repère en des coordonnées dans un autre repère, et vice-versa. Au fond c'est pas mal, mais j'ai l'impression qu'on peux mieux faire.
    Qu'en pensez-vous ? Avez-vous des solutions à ce problème ?
    Merci d'avoir prêté attention à mon problème.

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Bon pour faire simple: oublies les drawLine, drawRectangle &cie..

    Passes plutôt par les classes implémentant l'interface Shape comme les Line2D

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Line2D l = new Line2D.Double(0.123,0.5,1.999.2.78946);
    ET pour les afficher il te suffit d'utiliser les méthodes draw/fill (au choix) de la classe Graphics2D.

    Sinon pour le changement de repère translate et scale font bien le travail, je ne vois pas trop où est le problème.

    Par contre Sous classer Graphics2D est une mauvaise idée AMHA.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut méthode scale problématique
    Bonjour,
    Je voudrais bien utiliser la méthode scale pour mes changements de repere mais celle-ci epaissit l'épaisseur des traits du coefficient passé à scale. Du coup, ça n'a plus d'intéret.

    Un truc du genre :

    g2D.translate(500, 500);
    g2D.scale(50,50);

    Line2D.Double l = new Line2D.Double(x1,y1,x2,y2);
    g2D.draw(l);

    me trace un trait comme si je mettais l'instruction :
    g2D.setStroke(new BasicStroke(50));

    donc cela ne m'interresse plus.

    Comment m'en sortir ?
    Merci d'éclaircir ce mystère.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 49
    Points
    49
    Par défaut Non c'est bon, j'ai trouvé tout seul
    Merci,
    j'ai trouvé tout seul.
    Il suffit de faire
    g.setStroke(new BasicStroke(1/k));
    où k est le coef passé à scale.
    Il fallait le savoir...

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Bah utilisé une variable dans ta classe décrivant le niveau de zoom et affectant les coordonnées des Line2D au moment où tu les dessines.

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

Discussions similaires

  1. [MATH] Matrice de changement de repère.
    Par Mr Meuble dans le forum Moteurs 3D
    Réponses: 6
    Dernier message: 27/11/2008, 11h05
  2. Faire un changement de repère.
    Par tyke91 dans le forum OpenSceneGraph
    Réponses: 1
    Dernier message: 15/07/2008, 11h01
  3. Changement de repère
    Par Bloodista dans le forum OpenGL
    Réponses: 3
    Dernier message: 23/04/2007, 23h23
  4. URGENT : Zoom et changement de repère
    Par poca10 dans le forum MFC
    Réponses: 5
    Dernier message: 28/05/2002, 13h32

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