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