la fonction affiche_line utilise la focntion affiche_point de la mini bibliothèque de gestion d'écran avec l'interruption vidéo 10h, méthode pseudo variables.
#include "proto.h"
#define max(A,B) ((A) > (B) ? (A) : (B))
#define min(A,B) ((A) < (B) ? (A) : (B))
#define sign(x) ((x < 0) ? 1 : 0)
/*---------------affichage d'une ligne avec algorithme Bresenham ---------------------------------------*/
void affiche_line( struct ligne *ptr )
{
struct point p;
int x,y,dx,dy,adx,ady,d,d1,d2,step;
dx = ptr->p2.x - ptr->p1.x;
adx = abs(dx);
dy = ptr->p2.y - ptr->p1.y;
ady = abs(dy);
if (adx == 0)
{
y = min(ptr->p1.y,ptr->p2.y);
ady++;
while (ady--)
{
p.x = ptr->p1.x;
p.y = y++;
affiche_point( &p);
}
return;
}
if (ady == 0)
{
x = min( ptr->p1.x, ptr->p2.x);
adx++;
while (adx--)
{
p.x = x++;
p.y = ptr->p1.y;
affiche_point( &p);
}
return;
}
if (adx < ady)
{
d = (adx << 1) - ady;
d1 = adx << 1;
d2 = (adx -ady) << 1;
(ptr->p1.y < ptr->p2.y) ? ( x = ptr->p1.x , y = ptr->p1.y )
:( x = ptr->p2.x , y = ptr->p2.y );
step =((sign(dx) == sign(dy)) ? 1 : -1);
p.x = x ;
p.y = y ;
affiche_point( &p);
while (ady--)
{
y++;
if (d <0)
{
d += d1;
}
else
{
x += step;
d += d2;
}
p.x = x ;
p.y = y ;
affiche_point( &p);
}
}
else
{
d = (ady << 1) - adx;
d1 = ady << 1;
d2 = (ady -adx) << 1;
( ptr->p1.x < ptr->p2.x ) ? (x = ptr->p1.x , y = ptr->p1.y)
: ( x = ptr->p2.x , y = ptr->p2.y );
step = ((sign(dx) == sign(dy)) ? 1 : -1);
p.x = x ;
p.y = y ;
affiche_point( &p);
while (adx--)
{
x++;
if (d<0)
d += d1;
else
{
y += step;
d += d2;
}
p.x = x ;
p.y = y ;
affiche_point( &p);
}
}
}