> But the value of pi is incorrectly rounded and those double casts are > unnecessary; in any case we clearly do not need double precision: > (unsigned char)(int)(atan2f((x - me->p_x), (me->p_y - y)) / 3.141593 * 128.) Oops, wrong draft. :-P That should be: (unsigned char)(int)(atan2f(x - me->p_x, me->p_y - y) / 3.141593f * 128.f) > Fixing this requires rounding rather than truncation. With C99 and > IMO clearer layout: > (unsigned char) (int) ( roundf( 128.f*atan2f( dx, dy )/3.141593f ) ) And that should be: (unsigned char) (int) ( roundf( 128.f*atan2f( x - me->p_x, me->p_y - y )/3.141593f ) ) Final note: "0" being due north assumes that the x-axis points east and the y-axis points south. Cheers Michael