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

C Discussion :

dessiner triangle en c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Par défaut dessiner triangle en c
    bonjour a tous , je veux encore vous demander votre aide a propos d'un mini projet en c qu'un prof nous a demande de le faire , en effet on devait afficher l’entête de l'image de Lena.BMP et puis dessiner un triangle a partir des pixels de l'image . j'ai réussi a afficher l’entête mais je n'ai aucune idée comment faire pour dessiner ce triangle en parcourant les pixels de l'image voila ce que j'ai pu faire pour afficher l’entête de l'image .

    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
    92
    93
    94
    95
    96
    97
    98
    #include <stdio.h>
    #include <stdlib.h>
     
     
    struct entete_struct {  //structure (globale) ou seront stockées les infos de l'entete
    	char signature[2];
    	int taille;
    	int offset;
    	int taille_entete;
    	int largeur;
    	int longueur;
    	int plans;
    	int bpp;
    	int compression;
    	int taille_image;
    	int Hresolution;
    	int Vresolution;
    	int nbr_couleur;
    	int nbr_couleur_importante;
    }entete;
     
    int hex2dec (unsigned char hex[4],int nombre) //Fonction permettant de convertir un nombre hexa
    {					      //en décimal (plus facile à lire)
    	int resultat = 0;
    	int i;
     
    	for (i = nombre - 1; i >= 0; i--)
    	{
    		resultat = resultat * 256 + hex[i];
    	}
    	return resultat;
    }
     
    void lire_fichier (const char* nom)
    {
    	unsigned char temp[4]; //Zone mémoire temporaire où on stoque ce qui est lu dans le fichier avant
    	FILE * fichier;        //de le traiter.
     
    	fichier = fopen (nom,"r");
     
    	fread (&entete.signature,2,1,fichier); //signature codée sur 2 octets
    	fread (&temp,4,1,fichier);
    	entete.taille = hex2dec (temp,4); //taille totale du fichier, 4 octets
    	fread (&temp,4,1,fichier); //reservé
    	fread (&temp,4,1,fichier); //Offset de début de l'image, 4 octets
    	entete.offset = hex2dec (temp,4);
    	fread (&temp,4,1,fichier); //Taille de l'entete, 4 octets
    	entete.taille_entete = hex2dec (temp,4);
    	fread (&temp,4,1,fichier); //Largeur, 4 octets
    	entete.largeur = hex2dec(temp,4);
    	fread (&temp,4,1,fichier); //Longueur, 4 octets
    	entete.longueur = hex2dec(temp,4);
    	fread (&temp,2,1,fichier); //Nombre de plans ( 1 ), 2 octets
    	entete.plans = hex2dec (temp,2);
    	fread (&temp,2,1,fichier); //Nbre de bit par pixels, 2 octets
    	entete.bpp = hex2dec (temp,2);
    	fread (&temp,4,1,fichier); //Compression, 0 = rien, 4 octets
    	entete.compression = hex2dec (temp,4);
    	fread (&temp,4,1,fichier); //Taille de l'image, 4 octets
    	entete.taille_image = hex2dec (temp,4);
    	fread (&temp,4,1,fichier); //Resolution horizotale en pixels par mètre, 4octets
    	entete.Hresolution = hex2dec (temp,4);
    	fread (&temp,4,1,fichier); //Resolution verticale, en ixels par mètre, 4 octets
    	entete.Vresolution = hex2dec (temp,4);
    	fread (&temp,4,1,fichier); //Nombre de couleur utilisées, 0 = toutes, 4 octets
    	entete.nbr_couleur = hex2dec (temp,4);
    	fread (&temp,4,1,fichier); //Nombre de couleurs importantes, 0 = toues, 4 octets
    	entete.nbr_couleur_importante = hex2dec (temp,4);
     
    	//Si c'est un image 8 bit, cette entête est suivie de la palette.
            //Après la palette, ce sont les données de l'image
     
    	fclose (fichier);
    }
     
    main ()
    {
    	lire_fichier ("lena512.bmp"); //remplacez ici par le fichier, ou par un scanf ;-)
     
    	printf ("Signature : %s\n",entete.signature);
    	printf ("Taille du fichier : %d\n",entete.taille);
    	printf ("Offset de début de l'image : %d\n",entete.offset);
    	printf ("Taille du Bitmap Info : %d\n",entete.taille_entete);
    	printf ("Largeur : %d\n",entete.largeur);
    	printf ("Longueur : %d\n",entete.longueur);
    	printf ("Nombre de plans : %d\n",entete.plans);
    	printf ("Bits par pixels : %d\n",entete.bpp);
    	printf ("Schéma de compression : %d\n",entete.compression);
    	printf ("Taille de l'image : %d\n",entete.taille_image);
    	printf ("Résolution verticale : %d\n",entete.Vresolution);
    	printf ("Résolution horizontale : %d\n",entete.Hresolution);
    	printf ("Nombre de couleurs (0 = toutes) : %d\n",entete.nbr_couleur);
    	printf ("Nombre de couleurs importantes (0 = toutes) : %d\n",entete.nbr_couleur_importante);
     
     
    system("pause");
     
    }
    si vous pouvez m'aider a afficher le triangle ca sera sympa de votre part . merci d'avance .

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Tu reviens encore une troisième fois avec ton triangle

    Déjà, je serais toi, je ne m'amuserai pas à ouvrir un BMP "à la main" parce qu'une grosse partie sont mal formées parce qu'elles devraient utiliser la structure BITMAPV5HEADER ou la structure BITMAPV4HEADER et ne le font pas: BITMAPV5HEADER structure et BITMAPV4HEADER structure

    Et sinon on te l'a déjà dit. Pour dessiner un triangle, il faut savoir si tu veux dessiner le contour ou l'intérieur.
    Pour le contour c'est l'algorithme de tracé de segment de Bresenham que tu appliques 3 fois.

    Sinon comme je te proposais, tu parcoures tous les points de ton image et tu fais un test d'occlusion. Pour rien que le contour il faudra tester en plus si ton point appartient au segment ou non.

    Ou sinon tu peux aussi éventuellement te débrouiller avec un algo intérieur-extérieur ou (ici) en parcourant tous les points de ton image.

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Par défaut
    D'accord Merci beaucoup Nb: je ne reviendrai plus cette fois-ci

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    @clemence.lec, quelques remarques sur ton code :

    • tu ouvres un fichier image, par essence contenant des données binaires, avec un fopen("", "r"), il faut utiliser le flag "rb" à la place (b comme binary donc)
    • ta fonction hex2dec() ne sert rigoureusement à _rien_ tu peux la dégager
    • tu fais plusieurs fread() successifs pour lire 1 structure : saimal, c'est tout l'intérêt de la structure, on fait 1 fread unique et on colle notre structure dessus
    • ta structure pour l'entête va nécessiter un alignement (__attribute__((__packed__)))
    • du coup tu ne peux pas utiliser %s pour afficher entete.signature, ça n'est pas une chaine terminée par un caractère nul '\0', si tu regardes l'intérieur de lena512.bmp la signature est immédiatement suivie par d'autres valeurs, les autres champs de la structure, un "effet de bord" de l'alignement de la structure mais c'est bien plus cohérent
    • les champs de l'entête ne sont pas tous des int, et il manque les champs réservés

    je te propose la modification suivante de ton code :
    Code c : 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
    #include <stdio.h>
    #include <stdlib.h>
     
    struct __attribute__((__packed__)) entete_struct {  //structure (globale) ou seront stockées les infos de l'entete
        char signature[2];
        int taille;
        short reserved1;
        short reserved2;
        int offset;
        int taille_entete;
        int largeur;
        int longueur;
        short plans;
        short bpp;
        int compression;
        int taille_image;
        int Hresolution;
        int Vresolution;
        int nbr_couleur;
        int nbr_couleur_importante;
    }entete;
     
    void lire_fichier (char *nom) {
        FILE *fichier = fopen (nom,"rb");
        fread (&entete, sizeof(entete),1, fichier);
        fclose(fichier);
    }
     
    int main (void) {
        lire_fichier ("lena512.bmp"); //remplacez ici par le fichier, ou par un scanf ;-)
     
        printf ("Signature : %c%c\n",entete.signature[0], entete.signature[1]);
        printf ("Taille du fichier : %d\n",entete.taille);
        printf ("Offset de début de l'image : %d\n",entete.offset);
        printf ("Taille du Bitmap Info : %d\n",entete.taille_entete);
        printf ("Largeur : %d\n",entete.largeur);
        printf ("Longueur : %d\n",entete.longueur);
        printf ("Nombre de plans : %d\n",entete.plans);
        printf ("Bits par pixels : %d\n",entete.bpp);
        printf ("Schéma de compression : %d\n",entete.compression);
        printf ("Taille de l'image : %d\n",entete.taille_image);
        printf ("Résolution verticale : %d\n",entete.Vresolution);
        printf ("Résolution horizontale : %d\n",entete.Hresolution);
        printf ("Nombre de couleurs (0 = toutes) : %d\n",entete.nbr_couleur);
        printf ("Nombre de couleurs importantes (0 = toutes) : %d\n",entete.nbr_couleur_importante);
     
        return 0;
    }
    par ailleurs je te conseillerais de mettre tous tes printf() pour l'affichage dans une fonction du genre affiche_entete() par exemple, pour gagner en lisibilité et en flexibilité

    à ce stade tu parviens à afficher l’entête du fichier, c'est loin d'être fini
    on peut raisonnablement supposer que ton fichier de test ressemble à celui-ci :


    notre programme qui marche du tonnerre nous dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Signature : BM
    Taille du fichier : 263222
    Offset de début de l'image : 1078
    Taille du Bitmap Info : 40
    Largeur : 512
    Longueur : 512
    Nombre de plans : 1
    Bits par pixels : 8
    Schéma de compression : 0
    Taille de l'image : 262144
    Résolution verticale : 0
    Résolution horizontale : 0
    Nombre de couleurs (0 = toutes) : 256
    Nombre de couleurs importantes (0 = toutes) : 0
    ce qui veut dire que chaque pixel est encodé sur 1 octet et sa valeur référence un index dans la palette de couleur, qu'il va falloir lire également (un tableau de 256 structures RGBQuad)
    une fois qu'on aura lu notre palette on aura enfin accès aux pixels de l'image, là la marche à suivre sera en gros :
    • de stocker l'image dans un tableau genre char image[entete.longueur*entete.largeur]
    • de créer une fonction putpixel(int x, int y, char couleur) pour modifier les pixels de l'image plus facilement
    • créer également une fonction permettant d'écrire un nouveau fichier bmp, à ce stade ce sera simple, il suffira de fwrite l'entete, la palette, les pixels, dans l'ordre. cette fonction te permettra par ailleurs de faire des tests et avoir un visuel sur les pixels que tu modifies dans l'image

    enfin, et parmis les remarques constructives qu'on a pu te faire préalablement, il y a notamment celle de webshaker qui te conseille de te rencarder sur l'algorithme de Bresenham qui est un algorithme de tracé de segments de droites, avec cet algorithme et ta fonction putpixel() tu seras en mesure de créer une fonction ligne(int x1, y1, x2, y2, char couleur), il ne restera dès lors plus qu'à tracer ton triangle

    mais d'ici là on est d'accord que ça fait du boulot

Discussions similaires

  1. dessiner triangle en c
    Par clemence.lec dans le forum C
    Réponses: 1
    Dernier message: 30/03/2015, 00h49
  2. dessiner triangle en c++
    Par clemence.lec dans le forum C++
    Réponses: 7
    Dernier message: 18/03/2015, 23h32
  3. Dessiner des anneaux composés des triangles adjacents
    Par fraisa1985 dans le forum Mathématiques
    Réponses: 5
    Dernier message: 02/11/2009, 09h44
  4. dessiner un triangle avec degradé de couleurs
    Par xantares dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2006, 11h59
  5. [ALGO] dessiner un triangle dans le bon sens
    Par lefait dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 05/02/2005, 14h38

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