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 :

[graphics] afficher un pixel


Sujet :

2D Java

  1. #1
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut [graphics] afficher un pixel
    Bonjour,

    je suis en train de programmer les fractales de mandelbrot. Chaque point de graphique nécécite un calcul qui détermine sa couleur.

    J'ai une image, un graphique issu de cette image... Et je fait comment pour afficher un seul point dans cette image ??? La classe graphique possaite un tas de methode très pratique (drawLine, draw3DRect, drawImage...) mais pas de methode permettant d'afficher un seul point (ou alors je suis bigleux).

    Je pourais évidement faire graphics.drawLine(x,y,x,y)... Mais bon c'est crados.

    Si un gourou de l'interface graphique a la solution...

    pour fixer les idées, voila le code en question :
    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
        public Image remplirImage(int largeur, int hauteur)
        {
            Image image = new BufferedImage(
                    largeur, hauteur, BufferedImage.TYPE_3BYTE_BGR) ;
            Graphics buffer = image.getGraphics() ;
     
            double x ; double y ; double xtmp ;
     
            for (int pxlA = 0 ; pxlA < largeur ; pxlA++)
            {
                for (int pxlB = 0 ; pxlB < hauteur ; pxlB++)
                {
                    double a = xMin + (pxlA * (xMax - xMin)) / largeur ;
                    double b = yMin + (pxlB * (yMax - yMin)) / hauteur ;
                    x = 0 ;
                    y = 0 ;
                    for (int i = 0 ; x < this.profondeur && (x*x + y*y) < 4 ; i++)
                    {
                        xtmp = x ;
                        x = x*x - y*y + a ;
                        y = 2.0 * xtmp * y + b ;
                    }
                    buffer.
                }
            }
            return image ;
        }

    ++ floanne

  2. #2
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Pourquoi ne pas utiliser :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer.drawRect(x,y,1,1);

  3. #3
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    bas c'est un peut comme drawLine(x,y,x,y)...

    C'est prendre un bazouka pour tuer une mouche...

    Mais peut être qu'il est impossible de faire autrement. En attendant mieu, je vais faire comme ça je pense...

    Merci, floanne.

  4. #4
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Je suis pas vraiment de ton avis, après tout un pixel, c'est juste un carré de 1 de côté, ce choix est donc logique...

  5. #5
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Pour les fractales de MandelBrot, tu n'es pas le seul, et je peux te dire qu'un drawLine est plus rapide qu'un drawRect.
    Une autre optimisation est de faire un seul drawLine tant que la couleur ne change pas.

    Si tu veux encore plus rapide, il faut copier directement les données dans le Raster d'une BufferedImage, que tu affiches par drawImage. J'ai abandonné à ce point là, si tu y arrives, tu pourras poster du code ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    merci des conseils...

    C'est bizard j'avais répondu à aDamas mais il semble que le message ne soit jamais arrivé (j'ai peut etre jamais appuier sur le bouton envoyer... ).

    Alors voila ce que je disais en substance :

    Pour le java et le raisonement "tout objet" c'est normale en effet de considèrer un pixel comme un rectange élémentaire de un pixel de coté...
    Par contre pour un affichage rappide...


    Encore merci xavlours : si je vais jusque là je posterais le code...

    ++floanne.

  7. #7
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Cela n'a rien de particulierement "crade" d'utiliser drawLine() pour afficher un pixel. Ca sera tres lent en revanche. L'approche de xavlours est la meilleure : utilise le Raster des BufferedImage.
    Romain Guy
    Android - Mon livre - Mon blog

  8. #8
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    ok je vais tester ça... Bon pour le moment je vois même pas ce que c'est mais je vais me documenter...

    Sinon, xavlours, peut ut me donner une idée pour associer une couleur à un entier...

    pour le moment j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        private Color getColor (int i)
        {
            return new Color (((i-1) * 256^3) / this.profondeur) ;
        }
    Mais c'est tout bleu et au plus j'utilise une profondeur élevée au plus c'est moche...

    ++floanne.

  9. #9
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Je me suis simplement borné à mettre l'image en niveaux de gris, pour que ce soit plus rapide : la valeur i du pixel est toujours inférieure à 255, et je fais new Color(i, i, i);

    Il y a plusieurs autres approches :
    - limiter le nombre de couleurs : les zooms sur les zones "chaotiques" sont très jolis avec moins de 10 couleurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int gray = (i % nbColors) * 255 / nbColors;
    return new Color(gray, gray, gray);
    - pour les images en couleur : associer des facteurs ou des modulos différents pour rouge vert et bleu. Je ne me souviens plus trop de ce que ça donne, mais essaye nbRedTaints = 64, nbGreenTaints = 128, nbBlueTaints = 256.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int red = (i % nbRedTaints) * 255 / nbRedTaints;
    int green = (i % nbGreenTaints) * 255 / nbGreenTaints;
    int blue = (i % nbBlueTaints) * 255 / nbBlueTaints;
    return new Color(red, green, blue)
    - associer les valeurs de i aux paramètres teinte/couleur/saturation des couleurs (jamais fait).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  10. #10
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    Merci,

    j'ai testé (en couleur) et c'est pas mal... Ca demande quelques réglage mais je pense que c'est une bonne méthode...

    ++floanne.

  11. #11
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    J'avais implemente un tel generateur il y a longtemps et une solution assez efficace est de creer des palettes de 256 couleurs et de piocher dedans. Ca permet de donner des "themes" a l'image. J'avais aussi essaye d'implementer en utilisant directement la valeur calculee pour la fractale comme couleur mais les palettes etaient plus jolies.
    Romain Guy
    Android - Mon livre - Mon blog

  12. #12
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    ok merci !

    Je note...
    Je vous dirai la solution que je retiendrai...

    Décidemment tu m'est d'une grand utilité Gfx : merci.

    ++floanne.

  13. #13
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Je viens de demander a un des ingenieurs Java2D et si tu n'utilises pas de Raster pour generer l'image, la facon la plus efficace de dessiner un pixel est d'utiliser fillRect().
    Romain Guy
    Android - Mon livre - Mon blog

  14. #14
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    Merci !

    je crois que je vais utiliser l'autre methode (Raster)...

    ++floanne.

  15. #15
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    j'ai quand meme essayé fillRect à la place de drawLine...

    Sur une image qui occupe la quasi totalité d'un mon écrant en 1600 par 1200 je n'ai pas remarqué de différance...

    J'ai fait des chrono (à la main) et j'ai 10s et des bananes avec les deux... J'ai même un poile plus avec fillRect (environ 30/100s en plus) mais comme c'est du fait main ça veut pas dire grand chose...

    Bref ce qui prend du temps ce sont le calcules : je vais arréter de me prendre la tete avec ça et faire le reste du prog...

    ++floanne.

  16. #16
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Je tiens l'information des ingenieurs qui ont implemente ces methodes donc bon... )
    Romain Guy
    Android - Mon livre - Mon blog

  17. #17
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    A mon avis ce sont mes chronos qui sont pourti... Quelques dixième de seconde à la mains sur 4 ou 5 mesures ça veut pas dire grand chose...

    Merci encore,
    ++floanne.

  18. #18
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    pour les couleur j'ai utilisé ça et ça marche assez bien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        private Color getColor (int i)
        {
            i = this.profondeur - i ;
            int blue = i * 4 % 256 ; 
            int red = i * 1 % 256 ; 
            int green = i * 16 % 256 ;
            return new Color(red, green, blue) ;
        }
    ++floanne

  19. #19
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Tu sais que tu peux chronometrer depuis le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    long start = System.currentTimeMillis(); // ou nano avec Java 1.5
    // ... ton code
    System.out.println("Temps en secondes : " + (System.currentTimeMillis() - start) / 1000.0d);
    Tu peux aussi utiliser le Profiler de NetBeans 5.0. Dans tous les cas, genere une image et affiche l'image.
    Romain Guy
    Android - Mon livre - Mon blog

  20. #20
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    vi vi je sais... mais j'avais la flemme...

    Merci, Floanne.

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

Discussions similaires

  1. afficher des pixels sur un qwidget
    Par gedeon555 dans le forum Qt
    Réponses: 4
    Dernier message: 23/03/2007, 16h56
  2. Afficher un pixel en C++
    Par abel_b dans le forum C++
    Réponses: 17
    Dernier message: 19/08/2006, 17h53
  3. afficher un pixel à l'écran
    Par djamal_internet dans le forum C++
    Réponses: 5
    Dernier message: 15/06/2006, 09h05
  4. [FreePascal] Afficher un pixel en RGB
    Par MatMeuh dans le forum Free Pascal
    Réponses: 23
    Dernier message: 20/05/2005, 01h16
  5. Difficultés pour afficher un pixel à l'écran
    Par Bubonik software dans le forum C
    Réponses: 9
    Dernier message: 17/08/2003, 12h48

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