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

Bibliothèques C++ Discussion :

[CImg] Problème pour dessiner des cercles [Débutant(e)]


Sujet :

Bibliothèques C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 38
    Points
    38
    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 : 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
    #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
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	//Création de l'afficheur
    	CImgDisplay disp(size_w,size_h);
    	disp.display(img);
    	while (!disp.is_closed()){}
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 38
    Points
    38
    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 : 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
    #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.

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/06/2006, 17h00
  2. [XML word] problème pour créer des puces
    Par ratapapa dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 21/07/2005, 13h52
  3. Problème pour Télécharger des fichiers
    Par joce3000 dans le forum C++Builder
    Réponses: 8
    Dernier message: 21/01/2005, 10h30
  4. problème pour faire des blocs
    Par tinkye_winkye dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 04/01/2005, 14h13

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