Tous les cas d'orientation des segments sont traités sur les affichage 1 et 3, tracés sur les affichages 2 et 4.
Le source: SegmentEquation.cpp
/* Auteur: Nicolas JANEY             */
    /* nicolas.janey@univ-fcomte.fr      */
    /* Avril 2001                        */
    /* Illustration du trace de segment  */
    /* par utilisation de l'equation     */
    /* cartesienne                       */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #include <GL/glut.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    
    #include "ModuleCouleurs.h"
    #include "ModuleMenus.h"
    #include "ModuleReshape.h"
    
    static int aff = 0 ;
    static int yy = 0 ;
    
    void line(int *p1,int *p2) {
      glColor4fv(couleurBleu()) ;
      glBegin(GL_LINES) ;
      glVertex2f((float) p1[0],(float) p1[1]) ;
      glVertex2f((float) p2[0],(float) p2[1]) ;
      glEnd() ;
    }
    
    void pixel(int x,int y,float *c) {
      glColor4fv(c) ;
      glBegin(GL_QUADS) ;
      glVertex2f(x-0.5F,y-0.5F) ;
      glVertex2f(x-0.5F,y+0.5F) ;
      glVertex2f(x+0.5F,y+0.5F) ;
      glVertex2f(x+0.5F,y-0.5F) ;
      glEnd() ;
    }
    
    int round(float v) {
      return((int) ( (v<0.0F) ? (v-0.499999F) : (v+0.499999F))) ;
    }
    
    void ligne(float *c,int *p1,int *p2) {
      float a = ( p1[0] != p2[0] ) ? (float) (p2[1]-p1[1])/(p2[0]-p1[0]) : 10000000.0F ;
      float b = p1[1] - a * p1[0] ;
      if ( fabs(a) <= 1 ) {
        float y =(float) p1[1] ;
        pixel(p1[0],p1[1],c) ;
        int xinc = ( p2[0]>p1[0] ) ? 1 : -1 ;
        if ( xinc < 0 )
          a = -a ;
        for ( int x = p1[0]+xinc ; x != p2[0]+xinc ; x += xinc) {
          y += a ;
          pixel(x,round(y),c) ; } }
        else {
        a = 1.0F/a ;
        float x =(float) p1[0] ;
        pixel(p1[0],p1[1],c) ;
        int yinc = ( p2[1]>p1[1] ) ? 1 : -1 ;
        if ( yinc < 0 )
          a = -a ;
        for ( int y = p1[1]+yinc ; y != p2[1]+yinc ; y += yinc) {
          x += a ;
          pixel(round(x),y,c) ; } }
    }
    
    void ligneIncomplete(float *c,int *p1,int *p2,int max) {
      float a = ( p1[0] != p2[0] ) ? (float) (p2[1]-p1[1])/(p2[0]-p1[0]) : 10000000.0F ;
      float b = p1[1] - a * p1[0] ;
      if ( fabs(a) <= 1 ) {
        float y =(float) p1[1] ;
        pixel(p1[0],p1[1],c) ;
        int xinc = ( p2[0]>p1[0] ) ? 1 : -1 ;
        if ( xinc < 0 )
          a = -a ;
        for ( int x = p1[0]+xinc,cp = 0 ; ( x != p2[0]+xinc ) && ( cp < max ) ; x += xinc,cp++ ) {
          y += a ;
          pixel(x,round(y),c) ; } }
        else {
        a = 1.0F/a ;
        float x =(float) p1[0] ;
        pixel(p1[0],p1[1],c) ;
        int yinc = ( p2[1]>p1[1] ) ? 1 : -1 ;
        if ( yinc < 0 )
          a = -a ;
        for ( int y = p1[1]+yinc,cp = 0 ; ( y != p2[1]+yinc ) && ( cp < max ) ; y += yinc,cp++ ) {
          x += a ;
          pixel(round(x),y,c) ; } }
    }
    
    void display() {
      int p1[] = { -25,-5 } ;
      int p2[] = { 20,27 } ;
      int p3[] = { 25,-28 } ;
      int p4[] = { 7,11 } ;
      int p5[] = { -15,-28 } ;
      int p6[] = { -7,3 } ;
      int p7[] = { -22,27 } ;
      int p8[] = { 7,21 } ;
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
      glPushMatrix();
      switch (aff) {
        case 0 : ligne(couleurRouge(),p1,p2) ;
                 ligne(couleurVert(),p3,p4) ;
                 ligne(couleurJaune(),p5,p6) ;
                 ligne(couleurCyan(),p7,p8) ;
                 line(p1,p2) ;
                 line(p3,p4) ;
                 line(p5,p6) ;
                 line(p7,p8) ;
                 break ;
        case 1 : ligneIncomplete(couleurRouge(),p1,p2,yy) ;
                 ligneIncomplete(couleurVert(),p3,p4,yy) ;
                 ligneIncomplete(couleurJaune(),p5,p6,yy) ;
                 ligneIncomplete(couleurCyan(),p7,p8,yy) ;
                 line(p1,p2) ;
                 line(p3,p4) ;
                 line(p5,p6) ;
                 line(p7,p8) ;
                 break ;
        case 2 : ligne(couleurRouge(),p2,p1) ;
                 ligne(couleurVert(),p4,p3) ;
                 ligne(couleurJaune(),p6,p5) ;
                 ligne(couleurCyan(),p8,p7) ;
                 line(p2,p1) ;
                 line(p4,p3) ;
                 line(p6,p5) ;
                 line(p8,p7) ;
                 break ;
        case 3 : ligneIncomplete(couleurRouge(),p2,p1,yy) ;
                 ligneIncomplete(couleurVert(),p4,p3,yy) ;
                 ligneIncomplete(couleurJaune(),p6,p5,yy) ;
                 ligneIncomplete(couleurCyan(),p8,p7,yy) ;
                 line(p2,p1) ;
                 line(p4,p3) ;
                 line(p6,p5) ;
                 line(p8,p7) ;
                 break ; }
      glPopMatrix();
      glFlush();
      glutSwapBuffers() ;
    }
    
    void myinit() {
      glShadeModel(GL_SMOOTH);
      glClearColor(0.8F,0.8F,0.8F,1.0F);
    }
    
    void key(unsigned char key,int x,int y) {
      switch ( key ) {
        case 0x0D  : yy = 0;
                     aff = (aff+1)%4;
                     glutPostRedisplay();
                     break;
        case ' '   : yy = (yy+1)%60;
                     glutPostRedisplay();
                     break;
        case 0x1B  : exit(0);
                     break; }
    }
    
    int main(int argc,char **argv) {
      glutInit(&argc,argv);
      glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
      glutInitWindowSize(300,300); 
      glutInitWindowPosition(50,50); 
      glutCreateWindow("Segment par l'équation cartésienne"); 
      creationMenuBasique();
      myinit(); 
      setParametresOrthoBasique(-30.0,30.0,-30.0,30.0,-1000.0,1000.0);
      glutReshapeFunc(reshapeOrthoBasique);
      glutKeyboardFunc(key);
      glutDisplayFunc(display);
      glutMainLoop();
      return(0);
    }