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