Le source: RemplissageFacette3D.cpp
static void pixel(int x,int y,int z,int *xmin,int *xmax,int *zmin,int *zmax) {
      if ( x < xmin[y] ) {
        xmin[y] = x;
        zmin[y] = z; }
      if ( x > xmax[y] ) {
        xmax[y] = x;
        zmax[y] = z; }
    }
    
    static void cote(int xi,int yi,int zi,int xf,int yf,int zf,
                     int *xmin,int *xmax,int *zmin,int *zmax) {
      int i,cumul,cumulz;
      int x = xi;
      int y = yi;
      int z = zi;
      int dx = xf - xi;
      int dy = yf - yi;
      int dz = zf - zi;
      int xinc = (dx > 0) ? 1 : -1;
      int yinc = (dy > 0) ? 1 : -1;
      int zinc = (dz > 0) ? 1 : -1;
      dx = abs(dx);
      dy = abs(dy);
      dz = abs(dz);
      pixel(x,y,z,xmin,xmax,zmin,zmax);
      if ( dx > dy ) {
        cumul = dx / 2;
        cumulz = 0;
        for ( i = 1 ; i <= dx ; i++ ) {
          x += xinc;
          cumul += dy;
          cumulz += dz;
          if ( cumul >= dx ) {
            cumul -= dx;
            y += yinc; }
          while ( cumulz >= dx ) {
            cumulz -= dx;
            z += zinc; }
          pixel(x,y,z,xmin,xmax,zmin,zmax); } }
      else {
        cumul = dy / 2;
        cumulz = 0;
        for ( i = 1 ; i <= dy ; i++ ) {
          y += yinc;
          cumul += dx;
          cumulz += dz;
          if ( cumul >= dy ) {
            cumul -= dy;
            x += xinc; }
          while ( cumulz >= dy ) {
            cumulz -= dy;
            z += zinc; }
          pixel(x,y,z,xmin,xmax,zmin,zmax); } }
      pixel(xi,yi,zi,xmin,xmax,zmin,zmax);
      pixel(xf,yf,zf,xmin,xmax,zmin,zmax);
    }
    
    static void trame(int y,int x1,int z1,int x2,int z2,
                      void (*pixel)(int,int,int)) {
      int i,cumul;
      int x = x1;
      int z = z1;
      int dx = x2 - x1;
      int dz = z2 - z1;
      int xinc = ( dx > 0 ) ? 1 : -1;
      int zinc = ( dz > 0 ) ? 1 : -1;
      dx = abs(dx);
      dz = abs(dz);
      pixel(x,y,z);
      cumul = 0;
      for ( i = 1 ; i <= dx ; i++ ) {
        x += xinc;
        cumul += dz;
        while ( cumul > dx ) {
          cumul -= dx;
          z += zinc; }
        pixel(x,y,z); }
    }
    
    static void triangle(int x1,int y1,int z1,
                         int x2,int y2,int z2,
                         int x3,int y3,int z3,
                         void (*pixel)(int,int,int)) {
      int dim = y3-y1+1;
      int dy = -y1;
      int *xmin = new int[dim];
      int *xmax = new int[dim];
      int *zmin = new int[dim];
      int *zmax = new int[dim];
      for ( int y = 0 ; y < dim ; y++ ) {
        xmin[y] = 8192;
        xmax[y] = -1; }
      cote(x1,y1+dy,z1,x2,y2+dy,z2,xmin,xmax,zmin,zmax);
      cote(x2,y2+dy,z2,x3,y3+dy,z3,xmin,xmax,zmin,zmax);
      cote(x1,y1+dy,z1,x3,y3+dy,z3,xmin,xmax,zmin,zmax);
      for ( int y = 0 ; y < dim ; y++ )
        trame(y-dy,xmin[y],zmin[y],xmax[y],zmax[y],pixel);
      delete(xmin);
      delete(xmax);
      delete(zmin);
      delete(zmax);
    }
    
    static void trianglePartiel(int x1,int y1,int z1,
                         int x2,int y2,int z2,
                         int x3,int y3,int z3,
                         void (*pixel)(int,int,int),
                         int yi,int yf) {
      int dim = y3-y1+1;
      int dy = -y1;
      int *xmin = new int[dim];
      int *xmax = new int[dim];
      int *zmin = new int[dim];
      int *zmax = new int[dim];
      for ( int y = 0 ; y < dim ; y++ ) {
        xmin[y] = 8192;
        xmax[y] = -1; }
      cote(x1,y1+dy,z1,x2,y2+dy,z2,xmin,xmax,zmin,zmax);
      cote(x2,y2+dy,z2,x3,y3+dy,z3,xmin,xmax,zmin,zmax);
      cote(x1,y1+dy,z1,x3,y3+dy,z3,xmin,xmax,zmin,zmax);
      for ( int y = yi ; y <= yf && y < dim ; y++ )
        trame(y-dy,xmin[y],zmin[y],xmax[y],zmax[y],pixel);
      delete(xmin);
      delete(xmax);
      delete(zmin);
      delete(zmax);
    }
    
    void lignePixels(int xi,int yi,int zi,int xf,int yf,int zf) {
      int i,cumul,cumulz;
      int x = xi;
      int y = yi;
      int z = zi;
      int dx = xf - xi;
      int dy = yf - yi;
      int dz = zf - zi;
      int xinc = ( dx > 0 ) ? 1 : -1;
      int yinc = ( dy > 0 ) ? 1 : -1;
      int zinc = ( dz > 0 ) ? 1 : -1;
      dx = abs(dx);
      dy = abs(dy);
      dz = abs(dz);
      pixelOpenGL(x,y,z);
      if ( dx > dy ) {
        cumul = dx / 2;
        cumulz = 0;
        for ( i = 1 ; i <= dx ; i++ ) {
          x += xinc;
          cumul += dy;
          cumulz += dz;
          if (cumul >= dx) {
            cumul -= dx;
            y += yinc; }
          while (cumulz >= dx) {
            cumulz -= dx;
            z += zinc; }
          pixelOpenGL(x,y,z); } }
        else {
        cumul = dy / 2;
        cumulz = 0;
        for ( i = 1 ; i <= dy ; i++ ) {
          y += yinc;
          cumul += dx;
          cumulz += dz;
          if ( cumul >= dy ) {
            cumul -= dy;
            x += xinc; }
          while ( cumulz >= dy ) {
            cumulz -= dy;
            z += zinc; }
          pixelOpenGL(x,y,z); } }
    }
    
    void coteFacette(float *coul,int *p1,int *p2) {
      glColor4fv(coul);
      glPushMatrix();
      lignePixels(15+p1[0],15+p1[1],p1[2]*1000,15+p2[0],15+p2[1],p2[2]*1000);
      glPopMatrix();
    }