[OpenGL] Les cercles, pourquoi ca marche pas

Les cercles, pourquoi ca marche pas [OpenGL] - C++ - Programmation

Marsh Posté le 08-02-2004 à 10:25:15    

Hello tout le monde,
 
Bon je suis plutot Java mais j'avais envie d'essayer de jouer un peu avec OpenGL et je pige pas pourquoi il vaut mieux utiliser les sin et cos pour utiliser un cercle (j'ai quelques lacunes en math  :whistle: ), et que la formule (x-j)^2 + (y-k)^2 = r^2 me dessine plutot une élipse. Voilà le code qui m'embete:  
 
Faites pas attention à la propreté du code  ;)  
 
(Pour dessiner une sphere qui décrit un cercle)

Code :
  1. float CircleGetY(float x, float radius)
  2. {
  3. return radius - x*x;
  4. }
  5. GLvoid DrawPoint(GLvoid)
  6. {
  7. if(i < -0.990f && i > -1.010f)
  8. {
  9.  increment = true;
  10.  decrement = false;
  11. }
  12. if(i > 0.990f && i < 1.010f)
  13. {
  14.  increment = false;
  15.  decrement = true;
  16. }
  17. if(decrement)
  18.  i -= 0.1f;
  19. else
  20.  i += 0.1f;
  21. glTranslatef(i, decrement?CircleGetY(i, 1.0f):-1*CircleGetY(i, 1.0f), -3.0f);
  22. Draw();
  23. }
  24. GLvoid Draw(GLvoid)
  25. {
  26. GLUquadricObj *q;
  27. q = gluNewQuadric();
  28. gluSphere(q, 0.01f, 32, 16);
  29. }


 
(juste pour tracer un cercle, récupéré sur gamedev)

Code :
  1. const float TWOPI = 6.283185;
  2. void DrawCircle(float radius, int slices)
  3. {
  4.   float step = TWOPI/slices;
  5.   glBegin(GL_LINE_LOOP);
  6.   for(float angle = 0.0f; angle < TWOPI; angle+=step)
  7.     glVertex2f(cos(angle) * radius, sin(angle) * radius);
  8.   glEnd();
  9. }


 
Donc le 1er code me donne une trajectoire élliptique avec des angles assez visibles à gauche et à droite, et le deuxième me donne un cercle parfait.
 
Pourquoi ?  :heink:  
 
Merci  :jap:


Message édité par WhatDe le 08-02-2004 à 10:26:18
Reply

Marsh Posté le 08-02-2004 à 10:25:15   

Reply

Marsh Posté le 08-02-2004 à 10:30:01    

j'y connais rien en programmation, mais ce ne serait pas parce que les pixels ne sont pas carrés ? -> tu calcules par les coordonnées, t'as pas un cercle.
 
vous moquez pas si c'est une grosse connerie svp  :p   :whistle:


Message édité par tahitirouge le 08-02-2004 à 10:30:26
Reply

Marsh Posté le 08-02-2004 à 13:05:20    

gluSphere ==> oui, mais le reste, tu cherche a faire quoi?

Reply

Marsh Posté le 08-02-2004 à 13:13:13    

WhatDe a écrit :

glTranslatef(i, decrement?CircleGetY(i, 1.0f):-1*CircleGetY(i, 1.0f), -3.0f);

Donc tu parcours x, et calcules y en conséquence.
 
x² + y² = r²
 
donc
 
y = racine(r²-x²)
 
Mais ta méthode est crade. x² + y² = qq chose définit un bout du plan : le cercle, le disque, etc. C'est approprié si tu veux colorer pour chaque pixel de l'écran tous ceux qui sont dans un disque. Si tu veux tracer un cercle, le paramétrique (ta 2ème équation) est la plus appropriée : en fonction d'un paramètre, obtention d'un point de la courbe.

Reply

Marsh Posté le 08-02-2004 à 16:12:57    

youdontcare a écrit :

Donc tu parcours x, et calcules y en conséquence.
 
x² + y² = r²
 
donc
 
y = racine(r²-x²)
 
Mais ta méthode est crade. x² + y² = qq chose définit un bout du plan : le cercle, le disque, etc. C'est approprié si tu veux colorer pour chaque pixel de l'écran tous ceux qui sont dans un disque. Si tu veux tracer un cercle, le paramétrique (ta 2ème équation) est la plus appropriée : en fonction d'un paramètre, obtention d'un point de la courbe.


Merci  :jap:

Reply

Marsh Posté le 08-02-2004 à 16:34:46    

tahitirouge a écrit :

j'y connais rien en programmation, mais ce ne serait pas parce que les pixels ne sont pas carrés ? -> tu calcules par les coordonnées, t'as pas un cercle.

C'est le cas avec certains modes comme le 320x200 (aspect ratio de 1.6, affiché sur un écran 4/3 -> déformation). Comme il disait qu'il obtenait un cercle parfait avec la seconde méthode, ça venait de la première méthode, pas de l'écran.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed