Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    mars 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 46
    Points : 11
    Points
    11

    Par défaut [CImg] Problème pour dessiner des cercles

    Bonjour,

    Je débute avec la bibliothèque CImg et j'ai regardé les tutos et un peu la doc. Après quoi je me suis lancé dans un programme basique : afficher 4 cercles rouges dans une fenêtre.

    Voici mon code

    Code :
    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
    #include "CImg.h"
     
    using namespace cimg_library;
     
    unsigned int size_w = 800, size_h = 600;
    unsigned int cercle_nb = 4;
     
    int main() {
    	//Création de la liste d'images de taille 32
    	CImgList<> cercle_img(cercle_nb,32,32,1,3,0);
    	//Définition d'une couleur (rouge)
    	unsigned char color[] = {255,0,0};
    	//Création des 4 cercles de rayon 14, de couleur color, positionnés aux points (100,100) (200,200) ...
    	for (unsigned int cercle = 0; cercle<cercle_nb; cercle++){
    		cercle_img[cercle].draw_circle(100*cercle,100*cercle,14,color);
    	}
     
    	//Création de l'afficheur
    	CImgDisplay disp(size_w,size_h);
    	//Affichage des cercles
    	while (!disp.is_closed()){
    		for (unsigned int cercle = 0; cercle<cercle_nb; cercle++){
    			disp.display(cercle_img[cercle]);
    		}
    	}
     
    	return 0;
     
    }
    Le résultat est un cercle rouge mal positionné et trop gros qui scintille, voici l'image :



    Bref, il doit y avoir 2 ou 3 trucs que j'ai pas du comprendre. J'ai beau chercher, je ne trouve pas

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro Loïc Joly
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    4 873
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc Joly
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2004
    Messages : 4 873
    Points : 10 717
    Points
    10 717

    Par défaut

    Citation Envoyé par Bloodista Voir le message
    Bonjour,

    Je débute avec la bibliothèque CImg et j'ai regardé les tutos et un peu la doc. Après quoi je me suis lancé dans un programme basique : afficher 4 cercles rouges dans une fenêtre.

    Voici mon code

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "CImg.h"
     
    using namespace cimg_library;
     
    unsigned int size_w = 800, size_h = 600;
    unsigned int cercle_nb = 4;
     
    int main() {
    	//Création de la liste d'images de taille 32
    	CImgList<> cercle_img(cercle_nb,32,32,1,3,0);
    J'ai l'impression que tu n'as pas trop compris la notion d'image dans CImg. Une image représente une zone sur laquelle tu peux dessiner. Ici, d'après ta description, tu ne veux pas faire 4 images, mais une image dans laquelle tu dessines 4 cercles. Donc, pas de CImgList, juste un CImg. Cette zone ne doit pas avoir 32 comme taille, mais une taille plus raisonnable. Les effets de crénelage devraient disparaitre si tu donnes à l'image la même taille que ta fenêtre.
    Citation Envoyé par Bloodista Voir le message
    Code :
    1
    2
    3
    4
    5
    6
    7
     
    	//Définition d'une couleur (rouge)
    	unsigned char color[] = {255,0,0};
    	//Création des 4 cercles de rayon 14, de couleur color, positionnés aux points (100,100) (200,200) ...
    	for (unsigned int cercle = 0; cercle<cercle_nb; cercle++){
    		cercle_img[cercle].draw_circle(100*cercle,100*cercle,14,color);
    	}
    Et donc, là, tu dessines directement les 4 cercles sur ton unique image.
    Citation Envoyé par Bloodista Voir le message
    Code :
    1
    2
    3
    4
    5
    6
    7
     
    	//Création de l'afficheur
    	CImgDisplay disp(size_w,size_h);
    	//Affichage des cercles
    	while (!disp.is_closed()){
    		for (unsigned int cercle = 0; cercle<cercle_nb; cercle++){
    			disp.display(cercle_img[cercle]);
    Tu n'as pas besoin de rafraîchir continuellement l'image. Tant que le contenu ne change pas, un seul appel à display suffit.
    Code :
    1
    2
    3
    4
    	//Création de l'afficheur
    	CImgDisplay disp(size_w,size_h);
    	disp.display(img);
    	while (!disp.is_closed()){}

  3. #3
    Candidat au titre de Membre du Club
    Inscrit en
    mars 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 46
    Points : 11
    Points
    11

    Par défaut

    Merci beaucoup pour toutes ces précisions, ça éclaircit pas mal de choses

    J'ai pu afficher mes cercles et même les faire bouger

    Voici mon code, je me demande s'il existe une manière "plus propre" de le faire; sans "effacer l'image puis redessiner chaque cercle", mais en "déplaçant" les cercles de manière directe.

    Code :
    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
    #include "CImg.h"
     
    using namespace cimg_library;
     
    unsigned int size_w = 800, size_h = 600;
    unsigned int cercle_nb = 4;
     
    int main() {
    	// Création de l'image
    	CImg<> image(size_w,size_h,1,3);
    	image.fill(0);
    	// Définition d'une couleur (rouge)
    	unsigned char red[] = {255,0,0};
     
    	//Création de l'afficheur
    	CImgDisplay disp(size_w,size_h);
     
    	// Compteur pour bouger les cercles
    	int cpt = 0;
    	// Affichage et raffraichissement
    	while (!disp.is_closed()){
    		// Création des 4 cercles de rayon 14, de couleur red
    		for (unsigned int cercle = 0; cercle<cercle_nb; cercle++){
    			image.draw_circle(100*(cercle+1)+cpt,100*(cercle+1)+cpt,14,red);
    		}
    		// Affichage de l'image
    		disp.display(image);
    		// Effacement de l'image
    		image.fill(0);
    		// Incrémentation du compteur
    		cpt++;
    		// Retard de l'affichage
    		disp.wait(20);
    	}
     
    	return 0;
    }
    Par contre il semble qu'un .fill(0) soit nécessaire pour que les cercles apparaissent en rouge.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •