Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Bibliothèques
Bibliothèques Forum d'entraide sur les bibliothèques C++ : installation, utilisation. Avant de poster : Cours sur les bibliothèques C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/09/2012, 19h06   #1
Bloodista
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 45
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
Bloodista est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2012, 21h30   #2
JolyLoic
Rédacteur/Modérateur
 
Avatar de JolyLoic
 
Homme Loïc Joly
Développeur informatique
Inscription : août 2004
Messages : 4 675
Détails du profil
Informations personnelles :
Nom : Homme Loïc Joly
Âge : 38
Localisation : France

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

Informations forums :
Inscription : août 2004
Messages : 4 675
Points : 9 897
Points : 9 897
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()){}
JolyLoic est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/09/2012, 11h07   #3
Bloodista
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 45
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 45
Points : 11
Points : 11
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.
Bloodista est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h32.


 
 
 
 
Partenaires

Hébergement Web