Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > [OpenGL - SFML] Dessiner un cercle manuellement > Lecture du sujet

[OpenGL - SFML] Dessiner un cercle manuellement

Ou comment pratiquer avec les cosinus et les sinus

Vous devez être inscrit pour pouvoir poster des messages

RésoluLe problème de ce sujet a été résolu

Page : 1  2  Suivante
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1  2  Suivante
Hors ligne Hertzien' # Posté le 03/07/2008 à 15:29:17
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Bonjour à tous les zéros,

Voulant pratiquer avec les cosinus et les sinus (Faut dire que j'ai 11 ans, et que j'ai du mal à les comprendre :) ), je me suis mit à réfléchir sur un algorithme pour dessiner un cercle.

Je n'ai pas de "problème" au traçage, mais que ce dernier n'est pas lisse.
Une image vaut mieux qu'un long discours :

Image utilisateur
Zoom à 400%

Voici le code que je souhaite optimiser (Pas très propre)

Code : C++
 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
#include <SFML/Graphics.hpp>
#include <GL/gl.h>
#include <GL/glu.h>

#include <cmath>

void Draw();

double Angle = 0.f;
double Rayon = 200;

int main()
{
	sf::RenderWindow App(sf::VideoMode(640,480), "SFML - Circle");

	sf::Event Event;

	glMatrixMode( GL_PROJECTION );
	glLoadIdentity( );
	gluOrtho2D( 0, 640, 0, 480);
	
	while(App.IsOpened())
	{
		Draw();

		while(App.GetEvent(Event))
		{
			if(Event.Type == sf::Event::Closed)
			{
				App.Close();
			}
			if((Event.Type == sf::Event::KeyPressed)&&(Event.Key.Code == sf::Key::P))
			{
				App.Capture().SaveToFile("Cercle.png");
			}
		}

		App.Display();
		Angle = 0;

		sf::Sleep(0.015f);
	}
	return 0;
}

void Draw()
{
	int X = 0;
	int Y = 0;

	glClear(GL_COLOR_BUFFER_BIT);

	glBegin(GL_POINTS);
		
	while(Angle <= 360.f)
	{
		X = Rayon * cos(Angle * 3.14/180);
		Y = Rayon * sin(Angle * 3.14/180);

		glColor3ub( X, 255, Y);
		glVertex2i(X + (640 / 2) ,Y + (480 / 2));

		Angle += 0.1f;
	}

	glEnd();
}


Merci de votre soutien,
Midoagent47




Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne neuneutrinos # Posté le 03/07/2008 à 15:43:04
Avatar
Groupe : Membres
tu arrondit le résultat donc c'est pixelisé.

tu dois représenter les 0.36 pixels par exemples ;)

pour cela tu colorie le pixel intelligemment

imagine que le reste (entre 0 et 1)

imagine que ce soit un pourcentage ;)

si tu à u reste de 12 alors le pixel doit être à 88% transparent (ou 12% visible :lol: )
(je ne sais pas faire la transparence en SFML donc je m'arrêterais la :-° )
Édité le 03/07/2008 à 15:43:48 par neuneutrinos

:p il n'y a que les abriutis qui ne changent pas d'avis :p

notre équipe ;)

 
Hors ligne Hertzien' # Posté le 03/07/2008 à 15:47:14
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Ou plutôt comment gérer la transparence en OpenGL :S

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Bachir ElMagnifico # Posté le 03/07/2008 à 15:52:04
http://info-crea.tuxfamily.org
Avatar
Groupe : Membres
si tu veux utiliser pi, il faut plus de precision, sert toi de la bibliotheque cmath qui fournit une constante plus precise :)

Image utilisateur
cherche des partenaires - page de contact.
mon tuto sur OgreNewt: partie 1, partie 2, partie 3, partie 4
 
Hors ligne Fvirtman # Posté le 03/07/2008 à 15:54:42
Avatar
Groupe : Membres
Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
L'idée est bonne, mais au lieu de tracer des points tous les 0.1° d'angles (ce qui te donnera toujours des points si tu zoomes), trace donc des segments entre chaque point :)

pour cela, utilise Gl_LINE

--- "Toute tâche répétitive est automatisable..." ---
Tuto C/C++ basés sur des exemples :
http://perso.numericable.fr/~fvirtman/info/tuto/index.html
Mes programmes a peu pres finis :
http://perso.numericable.fr/~fvirtman/progs/index.html
 
Hors ligne Hertzien' # Posté le 03/07/2008 à 15:56:29
C++, C(encore)++ fort !
Avatar
Groupe : Membres
J'ai fait un #define Pi 3,1415926535897932384626433832795028841971 693993751058209749445923078164062862089986280348253421170679

Mais j'ai toujours le même résultat. Devrais je faire de l'anticrénélage ?

Fvirtman> Le résultat est encore mieux, mais l'angle je le met à combien ?
Édité le 03/07/2008 à 15:59:45 par Hertzien'

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Fvirtman # Posté le 03/07/2008 à 15:58:17
Avatar
Groupe : Membres
Déja, fait les segments comme je te dis
Ensuite, inutile de mettre autant de décimales a PI : 8 - 10 suffisent amplement

Ensuite, tu as aussi un effet d'optique, tu traces un cerle blanc sur fond noir : le contraste est tres tres fort, et l'oeil y est tres sensible.

--- "Toute tâche répétitive est automatisable..." ---
Tuto C/C++ basés sur des exemples :
http://perso.numericable.fr/~fvirtman/info/tuto/index.html
Mes programmes a peu pres finis :
http://perso.numericable.fr/~fvirtman/progs/index.html
 
Hors ligne Bachir ElMagnifico # Posté le 03/07/2008 à 15:59:52
http://info-crea.tuxfamily.org
Avatar
Groupe : Membres
il n'est pas blanc, c'est bleu tres claire :lol: l'oeil n'est pas assez sensible finalement

Image utilisateur
cherche des partenaires - page de contact.
mon tuto sur OgreNewt: partie 1, partie 2, partie 3, partie 4
 
Hors ligne Hertzien' # Posté le 03/07/2008 à 16:01:20
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Non je trace pas un cercle blanc sur un fond noir, la couleur change !

Voici mon nouveau code

Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Draw()
{
	int X = 0;
	int Y = 0;

	glClear(GL_COLOR_BUFFER_BIT);

	glBegin(GL_LINE_STRIP);
		
	while(Angle <= 360.f)
	{
		X = Rayon * cos(Angle * Pi/180);
		Y = Rayon * sin(Angle * Pi/180);

		glColor3ub( X, 255, Y);
		glVertex2i(X + (640 / 2) ,Y + (480 / 2));

		Angle ++;
	}

	glEnd();
}
Édité le 03/07/2008 à 16:07:59 par Hertzien'

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Fvirtman # Posté le 03/07/2008 à 16:02:02
Avatar
Groupe : Membres
oui, il est vrai :) mais contraste fort tout de meme :)
tout ce qui est sur fond noir amplifie tous les effet d'aliasing, de persistance rétinienne, et plein de trucs !
Le fond noir, c'est mal :)

--- "Toute tâche répétitive est automatisable..." ---
Tuto C/C++ basés sur des exemples :
http://perso.numericable.fr/~fvirtman/info/tuto/index.html
Mes programmes a peu pres finis :
http://perso.numericable.fr/~fvirtman/progs/index.html
 
Hors ligne Hertzien' # Posté le 03/07/2008 à 16:21:03
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Up ! :)

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Fvirtman # Posté le 03/07/2008 à 16:32:48
Avatar
Groupe : Membres
je te l'ai dit : l'oeil est sensible a cela, et le contraste tres fort entre ta ligne et ton fond noir empire les choses : c'est un effet d'optique.

Prend paint, ouvre paint, colorie ton fond en noir, prend la couleur blanche et trace un cercle : tu verras que ça fait pareil

--- "Toute tâche répétitive est automatisable..." ---
Tuto C/C++ basés sur des exemples :
http://perso.numericable.fr/~fvirtman/info/tuto/index.html
Mes programmes a peu pres finis :
http://perso.numericable.fr/~fvirtman/progs/index.html
 
Hors ligne Hertzien' # Posté le 03/07/2008 à 16:38:17
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Oui, en effet ! Par contre en utilisant Paint.NET on n'a pas de crénelage (Fond noir, et bords blancs !!)

Mais y a t-il moyen pour ne plus avoir ce crénelage ?

EDIT: J'ai fait un très grand Zoom (2400%) sur le cercle généré par Paint.NET, sur chaque pixel on diminue l'intensité de la couleur doucement pour qu'elle se rapproche de la couleur du fond:

Image utilisateur

Comment faire ceci ? :euh:

Édité le 03/07/2008 à 17:06:39 par Hertzien'

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne neuneutrinos # Posté le 03/07/2008 à 17:34:03
Avatar
Groupe : Membres
Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
c'est la gestion de la "transparence"

mais c'est de la 2D... donc tu peux travailler pixel par pixel ;)

:p il n'y a que les abriutis qui ne changent pas d'avis :p

notre équipe ;)

 
Hors ligne Hertzien' # Posté le 03/07/2008 à 18:36:12
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Bon voilà mon nouveau code, mais l'image est "mieux":

Code : C++
 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
void Draw()
{
	int X = 0;
	int Y = 0;

	glClear(GL_COLOR_BUFFER_BIT | GL_ALPHA_TEST);

	glBegin(GL_LINE_STRIP);
		
	while(Angle <= 360.f)
	{
		X = Rayon * cos(Angle * Pi/180);
		Y = Rayon * sin(Angle * Pi/180);

		//glColor3ub( X, 255, Y);
		glVertex2i(X + (640 / 2) ,Y + (480 / 2));

		glColor4ub(255,255,255, 50);
		glVertex2i(X + (640 / 2) + 1 ,Y + (480 / 2));

		glColor4ub(255,255,255, 25);
		glVertex2i(X + (640 / 2) + 1 ,Y + (480 / 2));

		Angle += 0.1f;
	}

	glEnd();
}

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Bachir ElMagnifico # Posté le 03/07/2008 à 18:37:01
http://info-crea.tuxfamily.org
Avatar
Groupe : Membres
remplace Angle += 0.1f; par Angle += 0.05f;

Image utilisateur
cherche des partenaires - page de contact.
mon tuto sur OgreNewt: partie 1, partie 2, partie 3, partie 4
 
Hors ligne Hertzien' # Posté le 03/07/2008 à 18:44:25
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Rien ne change ...

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Fvirtman # Posté le 03/07/2008 à 20:01:56
Avatar
Groupe : Membres
modifier l'angle ne changera pas l'aliasing.
Sauf erreur de ma part, les GL_LINE_STRIP, GL_POINT, et tous les autres, ne gerent pas l'antialiasing comme tu voudrais. Donc, a moins de reprogrammer manuellement quelque chose tu vas avoir du mal.
Mais apres, peut etre que cela a évolué depuis le temps, je ne sais pas !

Mais pourquoi tiens tu tant a enlever cet effet ? (j'attends ta réponse : c'est moche)

Je pense que, a l'avenir, tu mettras un autre fond que le fond noir non ? Je me repete, mais c'est ce fond noir qui te fait voir cet effet :) Le fond noir est un fléau qui fait réagir l'oeil humain. Sitot le fond noir enlevé, tu y verras beaucoup moins :)

Quel est ton but apres avoir fait cela ? Vers quoi veux tu t'orienter ?

--- "Toute tâche répétitive est automatisable..." ---
Tuto C/C++ basés sur des exemples :
http://perso.numericable.fr/~fvirtman/info/tuto/index.html
Mes programmes a peu pres finis :
http://perso.numericable.fr/~fvirtman/progs/index.html
 
Hors ligne Hertzien' # Posté le 03/07/2008 à 20:16:07
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Citation
Je pense que, a l'avenir, tu mettras un autre fond que le fond noir non ? Je me repete, mais c'est ce fond noir qui te fait voir cet effet :) Le fond noir est un fléau qui fait réagir l'oeil humain. Sitot le fond noir enlevé, tu y verras beaucoup moins :)


Mais comment font les développeurs de Paint.NET Et autres ? o_O

</citation>

Citation
Quel est ton but apres avoir fait cela ? Vers quoi veux tu t'orienter ?


Juste comprendre les Cosinus et les sinus parce que j'avais des problèmes de compréhension. ^^

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Bachir ElMagnifico # Posté le 03/07/2008 à 20:19:04
http://info-crea.tuxfamily.org
Avatar
Groupe : Membres
"Mais comment font les développeurs de Paint.NET Et autres ?"
il n'utilise pas focement OpenGl ;)

Image utilisateur
cherche des partenaires - page de contact.
mon tuto sur OgreNewt: partie 1, partie 2, partie 3, partie 4
 
Hors ligne Hertzien' # Posté le 03/07/2008 à 20:25:06
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Je ne parle pas que de OpenGL mais plutôt de la façon dont ils peuvent lisser les shapes.

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne SirJulio # Posté le 03/07/2008 à 20:57:27
Groupe : Membres
Pour la theorie, prends l'article anti-aliasing sur la wiki anglaise et suis les liens, il y a des trucs sympas.

Pour la pratique, SFML te permet deja de specifier un anti crenelage dans la creation de ta fenetre (troisieme parametre de WindowSettings). Refais ton dessin sur une background gris en alternant un AA à 0 et à 8, tu verras la difference. =)
Hors ligne Fvirtman # Posté le 03/07/2008 à 22:51:26
Avatar
Groupe : Membres
Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
Pour cosinus et sinus, tu as du comprendre, puisque tu l'as, ton cercle :)

Pour l'algo d'antialiasing, si tu regardes ton dessin en gros, tu vois que pour chaque pixel bien blanc (les pixels que tu as) il y a des a gauche et a droite 3 pixels dégradés. Cela se fait avec des algos simples, qui permettent d'afficher des pixels un par un. je te déconseille opengl pour faire cela.
Paint utilise d'une façon générale l'API windows, et la surface dessinée est un tableau de pixels.

--- "Toute tâche répétitive est automatisable..." ---
Tuto C/C++ basés sur des exemples :
http://perso.numericable.fr/~fvirtman/info/tuto/index.html
Mes programmes a peu pres finis :
http://perso.numericable.fr/~fvirtman/progs/index.html
 
Hors ligne Hertzien' # Posté le 04/07/2008 à 10:47:10
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Oui pour l'algo d'AA ça c'est fait mais il n'est pas complet. Quand on regarde les pixels en gros dans la partie d'en haut, on voit que ça va du gauche à droite. Mais quand on regarde les parties gauches ou droites du cercle, on voit qu'on ne va plus de gauche à droite mais de haut en bas. Donc ce que je voudrais faire, c'est de pouvoir détecter qu'on est dans cette partie et de dessiner les pixels juxtaposés en fonction de leur positionnement.

(Je sens déja que 99,99% des personnes ne vont rien comprendre de moi)

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Hertzien' # Posté le 05/07/2008 à 14:45:01
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Up ! Bon sinon, je vais abandonner l'AA, mais comment pourrais-je optimiser mon code ?

Merci

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne neuneutrinos # Posté le 05/07/2008 à 17:22:46
Avatar
Groupe : Membres
en fait si tu dois placer un point de coordonée 50.6;30

tu arrondis à 50;30 =>pixelisation
mais si on represente le pixel de coord 51;30 mais ce pixel sera transparent à 60%

le contraste noir blanc est tres fort mais le cercle peux quand meme être lissé. et meme donner un effet non pixelisé !

comment faire pour que mon programme calcule lui-même la transparence du pixel?


tu prend le resultat avec les cos et les sin et tu garde la virgule!

tu ajoutes le pixel de ton cercle (tronqué)

Apres tu fais la difference entre la vrais valeur et la valeur tronqué.

(int)(255*difference) =>transparence du pixel pour le lissage


;)

:p il n'y a que les abriutis qui ne changent pas d'avis :p

notre équipe ;)

 
Hors ligne Hertzien' # Posté le 05/07/2008 à 23:02:38
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Désolé mais ça ne change rien :
Voici mon code

Code : C++
 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
void Draw()
{
	double X = 0;
	double Y = 0;

	double Difference = 0;
	int Alpha = 0;

	glClear(GL_COLOR_BUFFER_BIT);

	glBegin(GL_POINTS);
		
	while(Angle <= 360.f)
	{

		X = Rayon * cos(Angle * Pi/180);
		Y = Rayon * sin(Angle * Pi/180);
		
		X += Hauteur / 2;
		Y += Largeur / 2;
		
		glColor3ub(255, 255, 255);
		glVertex2i(floor(X), floor(Y));

		Difference = ceil(X) - X;
		Alpha = static_cast<int>(Difference * 255);

		glColor4i(255, 255, 255, Alpha);
		glVertex2d(X, Y);

		Angle += 0.1f;
	}

	glEnd();
}
Édité le 05/07/2008 à 23:03:06 par Hertzien'

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne neuneutrinos # Posté le 06/07/2008 à 14:21:17
Avatar
Groupe : Membres
les points pour le lissage apparaisse?

:p il n'y a que les abriutis qui ne changent pas d'avis :p

notre équipe ;)

 
Hors ligne Hertzien' # Posté le 06/07/2008 à 14:23:44
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Ça c'est un autre problème parce que je n'arrive pas à enregistrer l'image avec la touche P : L'image est vide (Il juste la couleur de fond).

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Hertzien' # Posté le 07/07/2008 à 17:13:41
C++, C(encore)++ fort !
Avatar
Groupe : Membres
Up :)

Mon problème : [FFMpeg] Installation
Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 314 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.042s (0.0187s)