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

SDL Discussion :

Fonction flip Vertical pour une matrice


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Points : 9
    Points
    9
    Par défaut Fonction flip Vertical pour une matrice
    Bonjour monsieur! J'ai un ptit problème avec un programme que je dois réaliser! Il s'agir douvrir une image en fichier ppm et de donc savoir lire les coordonnées de cette matrice et puis ensuit de créer une autre fonction que me fasse le flip horizontal! Ja' essaillé avec le morceau que j'ai pu trouver chez vous mais ca ne marche pas vraiment! Bcp de fautes que je n'arrive pas à résoudre! Si vous pourriez m'aider ce serait trop généreux! En fait pour simplifier j'ai d'abord essaillé en entrant dans le programme le nombre de lignes et colonnes! Mais un truc cloche! Je dois le faire en language C et avec le compileur MIn WG! Si vous pourriez y jeter un oeil ou si vous connaissez qn ca serait trop bien car je dois remettre ce travail milieu avril :-(

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #include <stdio.h>
     
    #define NB_LIGNES 4;
    NB_COLONNES 3
     
    inline int getPixel(int i, int j, int w, int bytesperPix)
    {
    return (i*w + j)*bytesperPix;
    }
     
     
    void SDL_Surface *MonFlipV(SDL_Surface *im)
    {
    SDL_Surface *res;
    int i,j,src,dest;
     
    int bytesperpix;
    unsigned char *srcpixels, *destpixels;
     
    if(im==NULL)
    return NULL;
     
    bytesperpix = im->format->BytesPerPixel;
     
    // Creation d'une surface de meme taille
    res = SDL_CreateRGBSurface(SDL_HWSURFACE, im->w, im->h, im->format->BitsPerPixel,
    im->format->Rmask, im->format->Gmask, im->format->Bmask, im->format->Amask);
     
    if(res == NULL)
    return NULL;
     
    // Maintenant on inverse les pixels
    srcpixels = (unsigned char*) im->pixels;
    destpixels = (unsigned char*) res->pixels;
     
    for(i=0;i<im->h;i++)
    for(j=0;j<im->w;j++)
    {
    src = getPixel(i,j,im->w,bytesperpix);
    dest = getPixel(im->h-1-i,j,im->w,bytesperpix);
     
    destpixels[dest] = srcpixels[src];
    dest++;src++;
     
    destpixels[dest] = srcpixels[src];
    dest++;src++;
     
    destpixels[dest] = srcpixels[src];
    dest++;src++;
     
    if(bytesperpix==4)
    {
    destpixels[dest] = srcpixels[src];
    dest++;src++;
    }
    }
    return res;
    }
     
    main()
    {
    float a[NB_LIGNES][NB_COLONNES]; /* a est une matrice encodée par l'utilisateur */
    float c[NB_LIGNES][NB_COLONNES]; /* Résultat */
    int i, j; /* Indices */
     
     
    /* La matrice A est déjà initialisée; on demande à l'utilisateur de
    donner les valeurs pour la matrice B */
    for (i = 0; i < NB_LIGNES; ++i)
    for (j = 0; j < NB_COLONNES; ++j) {
    printf( "Valeur de l'élément %d,%d de la matrice B? ", i+1, j+1 );
    scanf( "%f", &a[i][j] );
    }
     
    /* Addition */
    for (i = 0; i < NB_LIGNES; ++i)
    for (j = 0; j < DNB_COLONNES; ++j)
    c[i][j] = SDL_Surface *MonFlipV(SDL_Surface *im); 
     
    /* Affichage du résultat avec les éléments en ordre */
    printf( "\nLa matrice vaut:\n" );
    for (i = 0; i < NB_LIGNES; ++i) {
    for (j = 0; j < NB_COLONNES; ++j)
    printf( " %12f", c[i][j] ); /* "%12f": printf ajoute des espaces à
    gauche du nombre, printf imprime 12 charactères */
    printf( "\n" ); /* point à la ligne après chaque ligne */
    }
     
     
    }

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonjour,

    Premièrement ton code n'est pas correct. Il y a des erreurs bizarres et la programmation n'est pas quelque chose qui se fait au hasard.

    Les choses de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define NB_LIGNES 4;
    NB_COLONNES 3
     
     
    c[i][j] = SDL_Surface *MonFlipV(SDL_Surface *im);
    montrent que tu ne comprends pas vraiment tout les concepts de la programmation. Il faudrait que tu passes un certain temps à revoir les bases avant de faire quoi que ce soit.

    Ensuite, la fonction MonFlipV prend en paramètre une surface déjà chargée et retourne une SDL_Surface donc il ne faut pas s'en servir case par case...

    L'algorithme général serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* Lire fichier ppm */
    SDL_Surface *depart = IMG_Load("fichier.ppm"); /* Utilise SDL_image */
     
    /* Gestion erreur si depart == NULL */
    ....
     
    SDL_Surface *arrivee = MonFlipV(depart); 
     
    /* Gestion erreur si arrivee == NULL */
    .....
     
    /* Tu fais ce que tu veux d'arrivee maintenant */
    Je ne vois rien de tel dans ton code, est-ce normal ?

    Jc

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonjour,
    voici quelques commentaires/informations afin de repartir du bon pied.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <stdio.h>
     
    #define NB_LIGNES 4;
    NB_COLONNES 3
    Ici, deux problèmes: le ';' après la constante du define. Tu t'exposes à des gros soucis pour la suite.
    Ensuite, il manque le '#define' devant NB_COLONNES

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    inline int getPixel(int i, int j, int w, int bytesperPix)
    {
    return (i*w + j)*bytesperPix;
    }
    Ici, un petit commentaire pour expliquer ce que fait ta fonction, et un peu plus d'expressivité dans les noms de paramètres serait un plus. Je vais même aller jusqu'à dire que le mot-clef 'inline' ne t'es pas nécessaire, rien ne sert de vouloir "optimiser" de manière précoce. De plus, ta fonction getPixel() aura peu de chance de te renvoyer la valeur d'un pixel, si le nom s'accorde avec son rôle.Peut-être que getPixelOffset() serait plus approprié?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void SDL_Surface *MonFlipV(SDL_Surface *im)
    Bon, deux types de retours pour une même fonction, t'es du genre gourmand. Le 'void' n'a pas lieu d'être là à priori.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    {
    SDL_Surface *res;
    int i,j,src,dest;
     
    int bytesperpix;
    unsigned char *srcpixels, *destpixels;
     
    if(im==NULL)
    return NULL;
     
    bytesperpix = im->format->BytesPerPixel;
     
    // Creation d'une surface de meme taille
    res = SDL_CreateRGBSurface(SDL_HWSURFACE, im->w, im->h, im->format->BitsPerPixel,
    im->format->Rmask, im->format->Gmask, im->format->Bmask, im->format->Amask);
     
    if(res == NULL)
    return NULL;
     
    // Maintenant on inverse les pixels
    srcpixels = (unsigned char*) im->pixels;
    destpixels = (unsigned char*) res->pixels;
     
    for(i=0;i<im->h;i++)
    for(j=0;j<im->w;j++)
    {
    src = getPixel(i,j,im->w,bytesperpix);
    dest = getPixel(im->h-1-i,j,im->w,bytesperpix);
     
    destpixels[dest] = srcpixels[src];
    dest++;src++;
     
    destpixels[dest] = srcpixels[src];
    dest++;src++;
     
    destpixels[dest] = srcpixels[src];
    dest++;src++;
     
    if(bytesperpix==4)
    {
    destpixels[dest] = srcpixels[src];
    dest++;src++;
    }
    }
    return res;
    }
     
    main()
    {
    float a[NB_LIGNES][NB_COLONNES]; /* a est une matrice encodée par l'utilisateur */
    float c[NB_LIGNES][NB_COLONNES]; /* Résultat */
    int i, j; /* Indices */
     
     
    /* La matrice A est déjà initialisée; on demande à l'utilisateur de
    donner les valeurs pour la matrice B */
    for (i = 0; i < NB_LIGNES; ++i)
    for (j = 0; j < NB_COLONNES; ++j) {
    printf( "Valeur de l'élément %d,%d de la matrice B? ", i+1, j+1 );
    scanf( "%f", &a[i][j] );
    }
    Ici, utilises la post-incrémentation. l'indiçage d'un tableau en C commence à 0. Hors je suspecte fortement que lors de ton premier tour de boucle, tes indices soit déjà à 1 ( ++i signifie "incrémenter la valeur de i, puis exploiter sa valeur" ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* Addition */
    for (i = 0; i < NB_LIGNES; ++i)
    for (j = 0; j < DNB_COLONNES; ++j)
    c[i][j] = SDL_Surface *MonFlipV(SDL_Surface *im);
    Un bête copier-coller qui a échoué à cet endroit?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* Affichage du résultat avec les éléments en ordre */
    printf( "\nLa matrice vaut:\n" );
    for (i = 0; i < NB_LIGNES; ++i) {
    for (j = 0; j < NB_COLONNES; ++j)
    printf( " %12f", c[i][j] ); /* "%12f": printf ajoute des espaces à
    gauche du nombre, printf imprime 12 charactères */
    printf( "\n" ); /* point à la ligne après chaque ligne */
    }
     
     
    }
    Je ne connais malheureusement pas le format des fichiers *.ppm, aussi je vais supposer que passer la la librairie SDL + SDL_Image est une bonne chose, bien que j'en doute .
    A mon avis, s'il s'agit d'un simple flip horizontal, pourquoi ne pas chercher à lire le fichier directement, et faire le flip aussi simplement que possible.
    Si ce genre d'exercice t'est demandé pour une date aussi lointaine, il y a fort à parier que ça suppose: une recherche sur le format ppm, et une recherche sur un algorithme qui fasse ton flip de manière suffisamment intelligente pour pas se marcher dessus une fois la moitié de la ligne atteinte.

    Cordialement,
    S. Desbois

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Points : 9
    Points
    9
    Par défaut rebonjour
    Pour vous Mr [QUOTE=alakazam]Bonjour,

    Ben comme vous avez du le remarquer c'est vrai que j'ai un peu de mal avec la programmation car c'est tout nouveau pour moi et je dois realiser ce programme pour milieu avril! :S Pour cela je tiens à vous remercier chalureuseent de votre aide! Ben je ne sais pas si je me suis bien expliqué au paravant mais c'est mon but que je voudrais avoir! Des fonctions très simples pour lire les données d'un fichier image .ppm et après une fonction flip horizontal et par la suite je saurais faire moi meme le flip vertical qui me rend la solution et ensuite j'aurai un programme valable! Car trop compliqué ne fera pas l'affaire si je dois l'expliquer et on ne travaillera pas non plus avec des photos trop grandes a dit le professeur! MERCI encore une fois et j'espère que vous pouurez encore m'aider d'avantage!

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Points : 9
    Points
    9
    Par défaut Recoucou
    Et bien je tenais également à vous remercier monsieur [QUOTE=fearyourself]Bonjour,


    Comme vous le remarquer je ne suis pas un expert de la matière! Enfin pas jusque pour le moment mais je maitrise petit à petit! hehe Je voulais vous demander également à vous s'il vous serait possible de m'indiquer alors une fonction pour le flip bcp plus simple avec moins de conditions pour pouvoir faire le flip d'une matrice! Et oui bien sur au départ il me faut aussi une pour l'onverture du fichier .ppm avant de pouvoir accéder aux données de l'image mais là aussi je n'ai pas encore tout juste! :S Je vous remercie d'avance!

  6. #6
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 21
    Points : 9
    Points
    9
    Par défaut Bonjour! Nouvelle idee de ma part ;)
    Voici un nouveau code plus simple que j'ai pu réaliser mais il y a encore des ptits soucis! Car quand j'ouvre ma photo couleur au départ et que je fais fonctionner ma fonction flip après je me retrouve avec une photo inversé oui mais presque pas de couleurs et je pense moins de pixels! c'est très bizarre! Pouriez vous m'aider sur ce problème? Merci
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <stdio.h>
    void main() {
    	FILE *fp;
    	int i, j,b,temp;
    	int a[324][195];
    	fp=fopen("moulin1.ppm","r");
    	for (i = 1; i < 324; i++)
    		{
    			for (j = 1; j < 195; j++)
    			{
    			fscanf(fp,"%d",&a[i][j]);
     
    		}
    		}
    		fclose(fp);
    		/*fp=fopen("Moulin2.ppm","w");
    		fprintf(fp,"P");
    		for (i = 1; i < 324; i++)
    		{
    			for (j = 1; j < 195; j++)
    			fprintf(fp,"%d ", a[i][j]);
    		 fprintf(fp,"\n");
     
    		}
    		fclose(fp);*/
            fp=fopen("fliphorizontal.ppm","w");
    		fprintf(fp,"P3\n");
    		fprintf(fp,"65 108\n");
    		fprintf(fp,"255\n");
    		for (i = 1; i < 324; i++)
    		/*{if (i == 1)
    		{for (b =5; b < 195; b++)
    		    j=324-i;
    			temp=a[i][b];
    	        a[i][b]=a[j][b];
    	        a[j][b]=temp;
    			fprintf(fp,"%d ", a[i][b]);
    			fprintf(fp,"\n");
    		    fprintf(fp,"%d ", a[j][b]);
    		    fprintf(fp,"\n");}
    		else*/ {for (b =1; b < 195; b++)
    		    {j=324-i;
    			    if (i<j)
    		    {
    			temp=a[i][b];
    	        a[i][b]=a[j][b];
    	        a[j][b]=temp;
    			fprintf(fp,"%d ", a[j][b]);
    			fprintf(fp,"%d ", a[i][b]);}
    	else break;}
    		}
    		fclose(fp);
    		}

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/06/2009, 23h17
  2. [E-07] aide pour une matrice des distances
    Par pheron dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 27/11/2008, 22h24
  3. type pour une matrice cubique d'entiers
    Par italiasky dans le forum C
    Réponses: 4
    Dernier message: 26/06/2007, 21h49
  4. flip vertical d'une matrice
    Par romain1986 dans le forum C
    Réponses: 8
    Dernier message: 13/04/2007, 10h35
  5. Réponses: 13
    Dernier message: 05/03/2007, 09h29

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