 
    
Le source: ExempleBresenhamCercle.cpp
/* Auteur: Nicolas JANEY           */
    /* nicolas.janey@univ-fcomte.fr    */
    /* Mars 2002                       */
    /* Trace de cercles                */
    /* par l'algorithme de Bresenham   */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <stdarg.h>
    
    #include <GL/glut.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    
    #include "ModuleCouleurs.h"
    #include "ModuleMenus.h"
    #include "ModuleFont.h"
    #include "ModuleFleche.h"
    #include "ModuleReshape.h"
    
    static int aff;
    static int yy;
    static int f1;
    static int f2;
    static char buffer[2000];
    static int pos;
    static float r = 20.0F;
    
    void dessineQuadrillage(void) {
      float i;
      glColor4fv(couleurGrisMoyen()) ;
      glBegin(GL_LINES);
      for ( i = -1.0 ; i < 24 ; i++ ) {
        glVertex2d(-1.0,i);
        glVertex2d(17.0,i); }
      for ( i = -1.0 ; i < 18 ; i++ ) {
        glVertex2d(i,-1.0);
        glVertex2d(i,23.0); }
      glEnd() ;
      glPushMatrix();
      glTranslatef(-0.5F,0.5F,0.0F);
      flecheEnVolume(17.2F,0.0F,0.0F,0.35F,1.4F,0.1F);
      glPopMatrix();
      glPushMatrix();
      glTranslatef(0.5F,-0.5F,0.0F);
      flecheEnVolume(0.0F,23.2F,0.0F,0.35F,1.4F,0.1F);
      glPopMatrix();
    }
    
    void arc(float r) {
      glLineWidth(3.0);
      glColor4fv(couleurBleu()) ;
      glBegin(GL_LINE_STRIP) ;
      for ( int i = 0 ; i <= 45 ; i++ ) {
        float angle = i * 3.14159F / 180 ;
        float x = (float) (r*cos(angle)+0.5F) ;
        float y = (float) (r*sin(angle)+0.5F) ;
        glVertex2f(y,x) ; }
      glEnd() ;
      glLineWidth(1.0);
    }
    
    void pixel(int x,int y,float *c) {
      glColor4fv(c) ;
      glBegin(GL_QUADS) ;
      glVertex2f(x,y) ;
      glVertex2f(x,y+1) ;
      glVertex2f(x+1,y+1) ;
      glVertex2f(x+1,y) ;
      glEnd() ;
    }
    
    void arcDiscret(float *c,float r) {
      int x,y,d ;
      x = 0 ;
      y =(int) r ;
      d =(int) (1 - r) ;
      pixel(x,y,c) ;
      while ( y > x ) {
        if ( d < 0 )
          d += 2 * x + 3 ;
          else {
          d += 2 * (x - y) + 5 ;
          y-- ; }
        x++ ;
        pixel(x,y,c) ; }
    }
    
    void arcIncomplet(float *c,float r,int max) {
      int x,y,d ;
      x = 0 ;
      y =(int) r ;
      d =(int) (1 - r) ;
      pixel(x,y,c) ;
      int cpt = 0;
      while ( ( y > x ) && ( cpt < max ) ) {
        cpt++;
        if ( d < 0 )
          d += 2 * x + 3 ;
          else {
          d += 2 * (x - y) + 5 ;
          y-- ; }
        x++ ;
        pixel(x,y,c) ; }
    }
    
    void output(float x,char *format,...) {
      va_list args;
      va_start(args,format);
      vsprintf(buffer,format,args);
      va_end(args);
      placeFontCursor(x,-pos*20.0F+10,0.0F) ;
      simpleBitmapOutput(1,REGULAR8x13,buffer) ;
    }
    
    void newLine() {
      pos += 1;
    }
    
    void arcIncompletTexte(float r,int max) {
      pos = 1;
      glColor4fv(couleurGrisMoyen());
      glBegin(GL_LINES);
      glVertex2f(205.0F,-5.0F);
      glVertex2f(205.0F,-320.0F);
      glVertex2f(245.0F,-5.0F);
      glVertex2f(245.0F,-320.0F);
      glVertex2f(5.0F,-22.0F);
      glVertex2f(345.0F,-22.0F);
      glEnd();
      glColor4fv(couleurBlanc());
      int x,y,d ;
      x = 0 ;
      y =(int) r ;
      d =(int) (1 - r) ;
      output(105.0F,"d") ;
      output(225.0F,"x") ;
      output(295.0F,"y") ;
      newLine();
      output(105.0F,"%d",d) ;
      output(225.0F,"%d",x) ;
      output(295.0F,"%d",y) ;
      newLine();
      int cpt = 0;
      while ( ( y > x ) && ( cpt < max ) ) {
        cpt++;
        int old = d;
        if ( d < 0 ) {
          d += 2 * x + 3 ;
          output(105.0F,"%d+2*%d+3 -> %d",old,x,d) ;
          output(295.0F,"%d",y) ; }
          else {
          d += 2 * (x - y) + 5 ;
          output(105.0F,"%d+2*(%d-%d)+5 -> %d",old,x,y,d) ;
          y-- ;
          output(295.0F,"%d -> %2d",y+1,y) ; }
        x++ ;
        output(225.0F,"%d",x) ;
        newLine(); }
    }
    
    void display() {
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
      glPushMatrix();
      dessineQuadrillage();
      glColor4fv(couleurGrisMoyen());
      glLineWidth(3.0);
      glBegin(GL_LINES);
      glVertex2f(0.5F,0.5F);
      glVertex2f(16.5F,16.5F);
      glEnd();
      glLineWidth(1.0);
      switch (aff) {
        case 0 : arc(r) ;
                 break ;
        case 1 : arcDiscret(couleurRouge(0.5F),r) ;
                 arc(r) ;
                 break ;
        case 2 : arcIncomplet(couleurRouge(0.5F),r,yy) ;
                 arc(r) ; }
      glutPostWindowRedisplay(f2);
      glPopMatrix();
      glFlush();
      glutSwapBuffers() ;
    }
    
    void myinit() {
      glEnable(GL_ALPHA_TEST);
      glEnable(GL_BLEND);
      glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
      glClearColor(0.8F,0.8F,0.8F,1.0F);
      setAlignement(CENTER);
    }
    
    void key(unsigned char key,int x,int y) {
      switch ( key ) {
        case 32   : yy = (yy+1)%15 ;
                    glutPostWindowRedisplay(f1);
                    break;
        case 0x0D : yy = 0 ;
                    aff = (aff+1)%3 ;
                    glutPostWindowRedisplay(f1);
                    break;
        case 0x1B : exit(0) ;
                    break; }
    }
    
    void display2(void) {
      glClearColor(0.0F,0.0F,0.0F,1.0F) ;
      glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
      glPushMatrix();
      switch (aff) {
        case 2 : arcIncompletTexte(r,yy) ; }
      glPopMatrix();
      glFlush();
      glutSwapBuffers();
    }
    
    void reshape2(int w,int h) {
      glViewport(0,0,w,h);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glOrtho(0,w,-h,0,-1.0,1.0); 
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
    }
    
    int main(int argc,char **argv) {
      glutInit(&argc,argv);
      glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
      glutInitWindowSize(270,360); 
      glutInitWindowPosition(50,10); 
      f1 = glutCreateWindow("Cercle par l'algorithme de Bresenham"); 
      myinit(); 
      creationMenuBasique();
      setParametresOrthoBasique(-1.5,17.5,-1.2,17.8,-40.0,40.0);
      glutReshapeFunc(reshapeOrthoBasique);
      glutKeyboardFunc(key);
      glutDisplayFunc(display);
      glutInitWindowSize(350,325);
      glutInitWindowPosition(350,10);
      glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
      f2 = glutCreateWindow("Valeurs");
      creationMenuBasique();
      glutDisplayFunc(display2);
      glutReshapeFunc(reshape2);
      glutKeyboardFunc(key);
      glutMainLoop();
      return(0);
    }