(déplacement de robot .. etc)
ressource: http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#C
Ce site contient des codes facile à utiliser
Algorithme et code bien fonctionnel , mais plutôt mal écrit pas simple à comprendre , le break , les opérateurs ternaires!
à revoir. Ou à voir !
Version originale du site Rosetta:
void line(int x0, int y0, int x1, int y1) {
int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1; /* les opérateurs ternaires pas très lisible */
int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1;
int err = (dx>dy ? dx : -dy)/2, e2;
/* une boucle infinie très moyen on dirait du python !*/
for(;;){
setPixel(x0,y0); /* ou une autre fonction , point(x0,y0) */
if (x0==x1 && y0==y1) break; /* maladroit le break */
e2 = err;
if (e2 >-dx) { err -= dy; x0 += sx; }
if (e2 < dy) { err += dx; y0 += sy; }
}
}
Faire mieux :
void line(int x0, int y0, int x1, int y1)
{
int dx,sx,dy,sy,err,e2;
dx= abs(x1-x0);
dy= abs(y1-y0);
if (x0<x1) sx=1; else sx=-1;
if (y0<y1) sy=1; else sy=-1;
if (dx>dy) err=dx; else err=-dy;
/* les opérateurs ternaires pas très lisible */
/*
int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
int dy = abs(y1-y0), sy = y0<y1 ? 1 : -1;
int err = (dx>dy ? dx : -dy)/2, e2;
*/
/* une boucle infinie très moyen on dirait du python !*/
/*
for(;;){
setPixel(x0,y0);
if (x0==x1 && y0==y1) break; /* maladroit le break */
e2 = err;
if (e2 >-dx) { err -= dy; x0 += sx; }
if (e2 < dy) { err += dx; y0 += sy; }
}
}
*/
do
{
setPixel(x0,y0);
e2 = err;
if (e2 >-dx)
{
err=err-dy;
x0=x0+sx;
}
if (e2 < dy)
{
err=err+dx;
y0=y0+sy;
}
}
while !(x0==x1 && y0==y1);
moralité l'algorithme est parfait ! rapide excellent ! mais il faut enlever les opérateur ternaires pour rendre ce code plus intéressant.
Ainsi que la boucle infinie ( for(;;) ) et son break !!
une boucle avec une belle condition de fin sera mieux vue !
Ce qui est en rouge doit être transformé en code C mieux écrit .