L'exécutable

 

Le source : RasterisationCercle.cpp

/* Un programme OpenGL de rasterisation         */
/* d'un cercle                                  */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Novembre 2009                                */

#include <stdlib.h>
#include <stdio.h>

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

static int scn = 0;
static int r = 50;

/* Scene dessinee                               */

void pixelsSymetriques(int x,int y) {
  glVertex2f(x,y);
  glVertex2f(-x,y);
  glVertex2f(x,-y);
  glVertex2f(-x,-y);
  glVertex2f(y,x);
  glVertex2f(-y,x);
  glVertex2f(y,-x);
  glVertex2f(-y,-x);
}

void cercle(int r) {
  int x,y,d;
  x = 0;
  y = r;
  d = 1 - r;
  glBegin(GL_POINTS);
  pixelsSymetriques(x,y);
  while ( y > x ) {
    if ( d < 0 )
      d += 2 * x + 3;
      else {
      d += 2 * (x - y) + 5;
      y--; }
    x++;
    pixelsSymetriques(x,y); }
  glEnd();
}

void scene1(void) {
  glPushMatrix();
  glColor3f(0.0F,0.0F,0.0F);
  cercle(r);
  glPopMatrix();
}

void disque(int r) {
  int *tx =(int *) calloc(r+1,sizeof(int));
  int x,y,d;
  x = 0;
  y = r;
  d = 1 - r;
  tx[y] = x;
  tx[x] = y;
  while ( y > x ) {
    if ( d < 0 )
      d += 2 * x + 3;
      else {
      d += 2 * (x - y) + 5;
      y--; }
    x++;
    tx[y] = x;
    tx[x] = y; }
  glBegin(GL_LINES);
  glVertex2i(tx[0],0);
  glVertex2i(-tx[0],0);
  for ( int i = 1 ; i <= r ; i++ ) {
    glVertex2i(tx[i],i);
    glVertex2i(-tx[i],i);
    glVertex2i(tx[i],-i);
    glVertex2i(-tx[i],-i); }
  glEnd();
  free(tx);
}

void scene2(void) {
  glPushMatrix();
  glColor3f(0.0F,0.0F,0.0F);
  disque(r);
  glPopMatrix();
}

/* Fonction executee lors d'un rafraichissement */
/* de la fenetre de dessin                      */

void display(void) {
  glClearColor(1.0F,1.0F,1.0F,1.0F);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glPushMatrix();
  if ( scn == 0 )
    scene1();
    else
    scene2();
  glPopMatrix();
  glFlush();
  glutSwapBuffers();
}

/* Fonction executee lors d'un changement       */
/* de la taille de la fenetre OpenGL            */

void reshape(int x,int y) {
  glViewport(0,0,x,y); 
  glMatrixMode(GL_PROJECTION) ;
  glLoadIdentity() ;
  glOrtho(-x/2,-x/2+x,-y/2,-y/2+y,-300.0,300.0) ;
  glMatrixMode(GL_MODELVIEW) ;
  glLoadIdentity() ;
}

/* Fonction executee lors de l'appui            */
/* d'une touche alphanumerique du clavier       */

void keyboard(unsigned char key,int x,int y) {
  switch (key) {
    case 43 :
      r++;
      glutPostRedisplay();
      break;
    case 45 :
      r--;
      if ( r == 0 )
        r = 1;
        else
        glutPostRedisplay();
      break;
    case 0x0D :
      scn = !scn;
      glutPostRedisplay();
      break;
    case 0x1B :
      exit(0);
      break; }
}

/* Fonction principale                          */

int main(int argc,char **argv) {
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
  glutInitWindowSize(240,240); 
  glutInitWindowPosition(50,50); 
  glutCreateWindow("Rasterisation d'un cercle"); 
  glutKeyboardFunc(keyboard);
  glutReshapeFunc(reshape);
  glutDisplayFunc(display);
  glutMainLoop();
  return(0);
}

RETOUR