/* RELATIVE BEARING * Returns the result of a comparison between this object, and another obejct * in terms of 'degrees, mark elevation'. Degree measurements are in a clock * wise direction; i.e. front, right, back, left. Elevation is in an anti- * clock wise direction; i.e. front, top, back, below. */ #define R_TO_D 57.29577951 #define X 0 #define Y 1 #define Z 2 mixed *relative_bearing(int *coordinates1, int coordinates2); int calc_direction(int *coordinates1, int *coordinates2); int calc_elevation(int *coordinates1, int *coordinates2); int x1, y1, z1, x2, y2, z2; mixed *relative_bearing(int *coordinates1, int *coordinates2) { int direction, elevation; direction = calc_direction(coordinates1, coordinates2); elevation = calc_elevation(coordinates1, coordinates2); return ({ direction, elevation, }); } int calc_direction(int *coordinates1, int *coordinates2) { float result; x1 = coordinates1[X]; y1 = coordinates1[Y]; x2 = coordinates2[X]; y2 = coordinates2[Y]; if(x2>x1 && y2>y1) result = atan(to_float((x2-x1)/(y2-y1))); else if(x2>x1 && y2<y1) result = atan(to_float((y2-y1)/(x2-x1)) + 90/R_TO_D); else if(x2<x1 && y2<y1) result = atan(to_float((x1-x2)/(y1-y2)) + 180/R_TO_D); else result = atan(to_float((y2-y1)/(x1-x2)) + 270/R_TO_D); result = result * R_TO_D; return to_int(result); } int calc_elevation(int *coordinates1, int *coordinates2) { float result; z1 = coordinates1[Z]; y1 = coordinates1[Y]; z2 = coordinates2[Z]; y2 = coordinates2[Y]; if(z2>z1 && y2>y1) result = atan(to_float((y2-y1)/(z2-z1))); else if(z1>z2 && y2>y1) result = atan(to_float((z1-z2)/(y2-y1)) + 90/R_TO_D); else if(z1>z2 && y1>y2) result = atan(to_float((y1-y2)/(z1-z2)) + 180/R_TO_D); else result = atan(to_float((z2-z1)/(y1-y2)) + 270/R_TO_D); result = result * R_TO_D; return to_int(result); }