Explication de l'algorithme de Bresenham
Bonjour à tous !
Pour un projet d'écoles je dois etre capable de tracer une droite dans n'importe quel sens et n'importe ou dans la fenetre. Du coup apres quelques recherche je suis tombé sur bresenham qui à l'air d'etre un algo top pour faire des tracer en tout genre ! Sauf seul probleme ... je ne le comprends pas mais pas du tout j'ai reussi à plus ou moins faire quelque chose mais cela ne marche pas correctement du coup je pense que ma comprehension de l'algo n'est pas bonne ...
Du coup si quelqu'un serait motivé pour m'expliquer toute la partie mathematique de l'algo ce serait avec plaisir !
Merci à vous !
Pour les curieux voila mon code, faux bien sur... qui ne gere pas deux octants ...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
int e;
int dx;
int dy;
//CAS DES LIGNES DROITES
if(x1 == x2)
{
if(y2 > y1)
swap(&y1, &y2);
while(y1 >= y2)
{
draw(x1, y1, color);
y1 --;
}
}
if(y1 == y2)
{
if(x2 > x1)
swap(&x1, &x2);
while(x1 >= x2)
{
draw( x1, y1, color);
x1 --;
}
}
//FIN
//CAS OU X2 > X1 ET Y2 > Y1
if ((x2 > x1 && y2 > y1) ||(x2 < x1 && y2 < y1) )
{
if (x1 > x2 && y1 > y2) // CAS OU X2 < X1 et Y2 < Y1
{
swap(&x1, &x2);
swap(&y1, &y2);
}
e = x2 - x1;
dx = e * 2; // 10
dy = (y2 - y1) * 2;
while (x1 <= x2)
{
draw(x1, y1, color);
// printf("X = %d || Y = %d\n",x1, y1);
x1++;
e = e - dy;
if (e <= 0)
{
y1++;
e += dx;
}
}
}
//FIN DE CAS
else if ((x2 < x1 && y2 > y1) || (x2 > x1 && y2 < y1))//CAS OU X2 < X1 ET Y2 > Y1
{
if (x2 > x1 && y2 < y1) //CAS OU X2 > X1 ET Y2 < Y1
{
swap(&x1, &x2);
swap(&y1, &y2);
}
e = x1 - x2;
dx = e * 2;
dy = (y2 - y1) * 2;
while (x2 <= x1)
{
draw(x2, y2, color);
// printf("X = %d || Y = %d\n",x2, y2);
x2++;
if ((e = e - dy) <= 0)
{
y2--;
e = e + dx;
}
}
} |