Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [2.0] - Une image pixel par pixel  (Lu 3139 fois)

0 Membres et 1 Invité sur ce sujet

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
[2.0] - Une image pixel par pixel
« le: Décembre 10, 2012, 10:23:38 pm »
Bonjour, j'ai déjà cherché des informations sur le sujet et testé un code mais quelque chose ne vas pas, est-ce que j'ai mal compris le principe ou est-ce que j'ai fait un faute d'étourderie, je ne sais pas et après avoir tenté pas mal de choses je voudrais avoir un avis extérieur  :).
(Le code a pour but de dessiner la fractale de Mandelbrot pixel par pixel)

Je crée mon tableau de pixels :

const sf::Uint8 *Generator::update(Seed seed)
{
    if(m_image) delete m_image;
    m_image = new sf::Uint8[seed.getSize().x*seed.getSize().y*4];

    for(int x(0) ; x!=seed.getSize().x ; ++x)
    {
        for(int y(0) ; y!=seed.getSize().y ; ++y)
        {
            seed.reset(x, y);
            unsigned int i(0);

            while(seed.getCriticalSqMod()<4
                  && i!=seed.getIteration())
            {
                seed.loop(x, y);
                ++i;
            }

            unsigned int pos(y + x*seed.getSize().y);
            if(i==seed.getIteration())
            {
                m_image[pos]    = 255;
                m_image[pos+1]  = 255;
                m_image[pos+2]  = 255;
                m_image[pos+3]  = 255;
            }
            else
            {
                m_image[pos]    = 0;
                m_image[pos+1]  = 0;
                m_image[pos+2]  = 0;
                m_image[pos+3]  = 0;
            }
        }
    }

    return m_image;
}

Et ensuite j'utilise ce tableau pour faire un Sprite :

    Seed seed;
    Generator engine;

    sf::Texture txtr;
    txtr.create(seed.getSize().x, seed.getSize().y);
    txtr.update(engine.update(seed));

    sf::Sprite sprite(txtr);

Seulement j'obtiens simplement une belle image blanche au lieu de ma fractale. Je ne pense pas que l'erreur vienne des calculs mathématiques, et je n'ai pas posté le détail, au moins je saurais si cela viens de mon utilisation de SFML.

Merci d'avance.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [2.0] - Une image pixel par pixel
« Réponse #1 le: Décembre 10, 2012, 10:59:15 pm »
Il manque un *4 sur pos (chaque pixel possède 4 composantes, RGBA), mais ça n'explique pas la blanchitude totale de l'image.

Le code a l'air ok, assure-toi que tu passes bien de temps en temps dans le else avec un debugger ou des printf.
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : [2.0] - Une image pixel par pixel
« Réponse #2 le: Décembre 11, 2012, 12:59:55 pm »
Alors là je ne comprends pas, en ajoutant *4 et en changeant l'alpha du else a 255, le programme cesse de fonctionner.

    std::cout << 0;
    if(m_image)
        delete m_image;
    std::cout << 1;

Le plantage serait à ce niveau là, pourtant je ne vois pas ce qu'il peut arriver sur ce simple delete  :-\ (oui, oui les delete ne sont pas simples).
De plus cette ligne était présente dans le code précédent qui ne bloquait pas à ce niveau là ....
« Modifié: Décembre 11, 2012, 01:01:44 pm par Basta »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [2.0] - Une image pixel par pixel
« Réponse #3 le: Décembre 11, 2012, 01:18:00 pm »
Ton *4 doit être mal placé, et provoquer une écriture au-delà de la taille du tableau.
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : [2.0] - Une image pixel par pixel
« Réponse #4 le: Décembre 11, 2012, 03:52:43 pm »
Mais le tableau n'est pas encore crée et le pointeur est nul  ??? pourtant j'ai bien mis un test pour vérifier que le pointeur n'est pas nul

edit : je précise que seul le cout 0 est appelé

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : [2.0] - Une image pixel par pixel
« Réponse #5 le: Décembre 11, 2012, 03:56:25 pm »
En fait je n'avais pas initialisé mon pointeur, un pointeur par défaut n'est-il pas nul ?
Et l'image est toujours blanche ...

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : [2.0] - Une image pixel par pixel
« Réponse #6 le: Décembre 11, 2012, 03:59:46 pm »
De plus le else censé rendre un pixel noir est bien appelé

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [2.0] - Une image pixel par pixel
« Réponse #7 le: Décembre 11, 2012, 04:12:03 pm »
Citer
En fait je n'avais pas initialisé mon pointeur, un pointeur par défaut n'est-il pas nul ?
Non. Un truc non initialisé n'est pas initialisé ;)

Sinon, essaye de faire de l'exécution pas à pas, ou mets des printf, etc. Regarde comment ton code se comporte.
Laurent Gomila - SFML developer