Hi Thomas

> (unsigned char)(atan2((double) (x - me->p_x),
>                       (double) (me->p_y - y)) / 3.141592 * 128.);
> I am fairly certain per-C99 that the result of casting a negative floating
> point to any unsigned type is undefined, so exactly what happens may vary
> by architecture and compiler.

"If the value of the integral part cannot be represented by the
integer type, the behavior is undefined. … The remaindering operation
performed when a value of integer type is converted to unsigned type
need not be performed when a value of real floating type is converted
to unsigned type."

    (unsigned char)(int)(atan2((double) (x - me->p_x), (double)
(me->p_y - y)) / 3.141592 * 128.)

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.)

> I am not certain how the course system works, but guessing from the fact
> that it needs to fit in an unsigned char, I am thinking that 127 + the
> absolute value would be a good guess

> (1) Does all that sound correct?

Not quite.  Due north 0.0 maps to 0, not 127.

> (2) How is the unsigned char-based course system expected to work?
> 360 degrees carved into 255 slices?  Or Something else?

It is 360 degrees unequally divided into 256 slices: "0" has twice the
normal width and "180" has zero width.

Fixing this requires rounding rather than truncation.  With C99 and
IMO clearer layout:
    (unsigned char) (int) ( roundf( 128.f*atan2f( dx, dy )/3.141593f ) )