Je le destine aux bon programmeurs ASM (je veux dire, aux maniaques de l'optimisation).
Comparé à une implémentation de Bresenham, il est TRES légèrement plus lent. Mais il fait appel deux fois à une division, et comme vous le savez la division est l'instruction la plus lente du M68k... Un bon optimisateur trouvera moyen d'employer des techniques de précalcul et à... dépasser Bresenham ?
void ThibautLine(int x1, int y1, int x2, int y2)
{
int LongueurSegment;
int FrequenceSegmentsLongs;
int CompteurSegmentsLongs= -32;
int Lx, Ly;
int xincr, yincr;
if (x1 > x2) {xincr= -1; Lx= x1 - x2 + 1;}
else {xincr= 1; Lx= x2 - x1 + 1;}
if (y1 > y2) {yincr= -1; Ly= y1 - y2 + 1;}
else {yincr= 1; Ly= y2 - y1 + 1;}
if (Lx > Ly)
{ // + horiz que vert
LongueurSegment= (Lx+1) / Ly; // Ca marche mal sans le '+1', faut qu'on m'explique pk !
LongueurSegment= xincr >= 0 ? LongueurSegment : -LongueurSegment;
FrequenceSegmentsLongs= (Lx+1) % Ly;
FrequenceSegmentsLongs= FrequenceSegmentsLongs ? (Ly << 5) / FrequenceSegmentsLongs : 32767;
y2+= yincr;
do
{
if ((CompteurSegmentsLongs+= 32) >= FrequenceSegmentsLongs)
{
CompteurSegmentsLongs-= FrequenceSegmentsLongs;
x2= x1 + LongueurSegment + xincr;
do
PutPixel(x1, y1);
while ((x1+= xincr) != x2);
}
else
{
x2= x1 + LongueurSegment;
do
PutPixel(x1, y1);
while ((x1+= xincr) != x2);
}
} while ((y1+= yincr) != y2);
}
else
{ // + vert que horiz
LongueurSegment= (Ly+1) / Lx;
LongueurSegment= yincr >= 0 ? LongueurSegment : -LongueurSegment;
FrequenceSegmentsLongs= (Ly+1) % Lx;
FrequenceSegmentsLongs= FrequenceSegmentsLongs ? (Lx << 5) / FrequenceSegmentsLongs : 32767;
x2+= xincr;
do
{
if ((CompteurSegmentsLongs+= 32) >= FrequenceSegmentsLongs)
{
CompteurSegmentsLongs-= FrequenceSegmentsLongs;
y2= y1 + LongueurSegment + yincr;
do
PutPixel(x1, y1);
while ((y1+= yincr) != y2);
}
else
{
y2= y1 + LongueurSegment;
do
PutPixel(x1, y1);
while ((y1+= yincr) != y2);
}
} while ((x1+= xincr) != x2);
}
}



