Mmm, ça dépend de NBDIR.
S'il est assez petit, genre < 32, tu peux t'en sortir avec une table de sin et cos et des multiplications ( ~ NBDIR/4 multiplications )
Sinon tu peux utiliser une table d'arctan et du coup faire une division, comme dans la routine ci dessus, qui retourne un angle entre 0 et 255 :
char arctan255[33]={0,1,3,4,5,6 ,8,9,10,11,12, 13,15,16,18,19, 20,21,22,23,24, 25,25,26,27,28, 29,29,30,30,31 ,32,32};
unsigned char arctan(int start_x,int start_y,int goal_x,int goal_y)
{
int dx = (goal_x-start_x);
int dy = (goal_y-start_y);
unsigned char angle;
int shift=0;
int ratio;
if (dx==0&&dy==0)
return 0;
if (ABS(dy)>ABS(dx))
{
ratio = ABS((dx*32)/dy);
shift = 1;
}
else
ratio = ABS((dy*32)/dx);
angle = arctan255[ratio];
if (shift)
angle=64-angle;
if (dx<0)
angle=128-angle;
if (dy>0)
angle=256-angle;
return angle;
}
La précision peut être facilement améliorée, suffit d'avoir une table d'arctan de 128, 256... valeurs et de changer le ratio = ABS((dx*32)/dy) en conséquence.
En tout cas, pas besoin de normaliser