L'exécutable

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); } }
}

RETOUR