 
            
             
            
Fichier source : RemplissageTriangle2D.cpp
/* Remplissage 2D d'un triangle                 */
    /* Solution imparfaite car presentant           */
    /* des problemes lors du collage                */
    /* deux facettes adjacentes:                    */
    /* Apparition possible de trous car des pixels  */
    /* peuvent ne pas etre allumes a la limite      */
    /* entre les deux facettes car allumes          */
    /* pour aucune des deux facettes                */
    
    static void bord(int xi,int yi,int xf,int yf,int *px) {
      int dx,dy,i,xinc,yinc,cumul,x,y;
      x = xi;
      y = yi;
      dx = xf - xi;
      dy = yf - yi;
      xinc = ( dx > 0 ) ? 1 : -1;
      yinc = ( dy > 0 ) ? 1 : -1;
      dx = abs(dx);
      dy = abs(dy);
      px[y] = x;
      if ( dx > dy ) {
        cumul = dx>>1;
        for ( i = 1 ; i <= dx ; i++ ) {
          x += xinc;
          cumul += dy;
          if ( cumul >= dx ) {
            cumul -= dx;
            y += yinc; }
          px[y] = x; } }
        else {
        cumul = dy>>1;
        for ( i = 1 ; i <= dy ; i++ ) {
          y += yinc;
          cumul += dx;
          if ( cumul >= dy ) {
            cumul -= dy;
            x += xinc; }
          px[y] = x; } }
    }
    
    static void remplissageTriangle(int x1,int y1,int x2,int y2,int x3,int y3) {
      int xd[4096];
      int xg[4096];
      if ( (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1) > 0 ) {
        bord(x1,y1,x2,y2,xd);
        bord(x2,y2,x3,y3,xd);
        bord(x1,y1,x3,y3,xg); }
        else {
        bord(x1,y1,x2,y2,xg);
        bord(x2,y2,x3,y3,xg);
        bord(x1,y1,x3,y3,xd); }
      for ( int y = y1 ; y <= y3 ; y++ ) {
        for ( int x = xg[y] ; x <= xd[y] ; x++ ) {
          allumePixel(x,y); } }
    }