Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Basta le Décembre 10, 2012, 10:23:38 pm

Titre: [2.0] - Une image pixel par pixel
Posté par: Basta 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.
Titre: Re : [2.0] - Une image pixel par pixel
Posté par: Laurent 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.
Titre: Re : [2.0] - Une image pixel par pixel
Posté par: Basta 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à ....
Titre: Re : [2.0] - Une image pixel par pixel
Posté par: Laurent 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.
Titre: Re : [2.0] - Une image pixel par pixel
Posté par: Basta 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é
Titre: Re : [2.0] - Une image pixel par pixel
Posté par: Basta 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 ...
Titre: Re : [2.0] - Une image pixel par pixel
Posté par: Basta le Décembre 11, 2012, 03:59:46 pm
De plus le else censé rendre un pixel noir est bien appelé
Titre: Re : [2.0] - Une image pixel par pixel
Posté par: Laurent 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.