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

AWT/Swing Java Discussion :

dessiner un graphe problème de précision


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut dessiner un graphe problème de précision
    Bonjour,
    je dessine une graphe mais apparement je perd de la précision à cause de la conversion float->int(cf image).Les marques ne sont pas faite jusqu'au bout .
    Voici mon 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
    16
    17
    18
    19
    20
     
     
        protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(map == null)return;
        double uX = getWidth() / map.width;
        double uY = getHeight() / map.height;
        int mX = getWidth() / 2;
        int mY = getHeight() / 2;
        g.drawLine(mX, 0, mX, getHeight());
        g.drawLine(0, mY, getWidth(), mY);
        //les trait sur l'axe vertical
        for(int i = 0; i < map.height; i++){
            g.drawLine(mX - 5,(int)(i*uY), mX + 5,(int)(i*uY));
        }
        //les trait sur l'axe horizontal
        for(int i = 0; i < map.width; i++){
            g.drawLine((int)(i*uX), mY - 5, (int)(i*uX), mY + 5 );
        }
    }
    Existe-il des algo pour eviter de perdre de la precision ?
    merci d'avance.
    Images attachées Images attachées  

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 902
    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 902
    Billets dans le blog
    54
    Par défaut
    Quand on a besoin de dessin precis (mais pas forcement rapide) on utilise pas les primitives qui prennent des entiers en parametres mais les Shape qui sont en precision float ou double. Voir Line2D.Float et Line2D.Double et Graphics2D.
    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

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    merci, je vais voir ça

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    je viens de modifier le code en suivant ton conseil mais le problème reste le même.Peut être que je m'y prend mal ?
    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
    Graphics2D g2d = (Graphics2D) g;
        double uX = getWidth() / map.width;
        double uY = getHeight() / map.height;
        double mX = getWidth() / 2;
        double mY = getHeight() / 2;
        Line2D.Double x = new Line2D.Double(mX, 0, mX, getHeight());
        Line2D.Double y = new Line2D.Double(0, mY, getWidth(), mY);
        g2d.draw(x);
        g2d.draw(y);
    //    g.drawLine(mX, 0, mX, getHeight());
    //    g.drawLine(0, mY, getWidth(), mY);
        //les trait sur l'axe vertical
        for(double i = 0; i < map.height; i++){
            Line2D.Double l= new Line2D.Double(mX - 5,(i*uY), mX + 5,(i*uY));
            g2d.draw(l);
           // g.drawLine(mX - 5,(int)(i*uY), mX + 5,(int)(i*uY));
        }
        //les trait sur l'axe horizontal
        for(double i = 0; i < map.width; i++){
            Line2D.Double l= new Line2D.Double((i*uX), mY - 5, (i*uX), mY + 5 );
            g2d.draw(l);
            //g.drawLine((int)(i*uX), mY - 5, (int)(i*uX), mY + 5 );
        }

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 902
    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 902
    Billets dans le blog
    54
    Par défaut
    Ah oui j'oubliais et sinon pour rester dans la demi-mesure, une maniere d'ameliorer ca tout en gardant l'usage des primitives est bien sur de ne caster en int qu'a la fin quand on dessine dans le Graphics. Donc toutes tes operations precedentes doivent porter sur des float ou des double histoire d'avoir des calculs plus precis. Dans ton code, tu perds de la precision des la premiere division qui est une division entiere.

    EDIT - cette remarque portait sur ton premier code mais s'applique egalement a ton second post : tes 4 premieres divisions sont des divisions entiere, il ne suffit pas que le resultat soit un double ; l'une des deux operande doit etre un double egalement (donc cast via (double) ou usage de 2.0)!
    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

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    bien vue c'est bien ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double uX = getWidth() / (double)map.width;
    résoud le pb.Je croyais à tort que getWidth() retournait un double.
    Merci d'avoir consacré du temps pour une "connerie".

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

Discussions similaires

  1. Problème XValues pour dessiner un graphe
    Par hebh dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/10/2011, 16h28
  2. Réponses: 4
    Dernier message: 26/10/2005, 20h38
  3. [GUI]dessiner un graphe
    Par Malo dans le forum 2D
    Réponses: 9
    Dernier message: 13/09/2005, 17h30
  4. [FLASH MX] Problème de "précision"
    Par will-scs dans le forum Flash
    Réponses: 2
    Dernier message: 03/07/2005, 00h31
  5. [Dessin]dessiner des graphes
    Par mial dans le forum 2D
    Réponses: 4
    Dernier message: 27/04/2004, 19h51

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