#define WIN32_LEAN_AND_MEAN #include #include #include #define IS_LOOKING_N(HEADING) HEADING > 40960 && HEADING < 57344 #define IS_LOOKING_NE(HEADING) HEADING == 57344 #define IS_LOOKING_E(HEADING) HEADING > 57344 && HEADING < 8192 #define IS_LOOKING_SE(HEADING) HEADING == 8192 #define IS_LOOKING_S(HEADING) HEADING > 8192 && HEADING < 24576 #define IS_LOOKING_SW(HEADING) HEADING == 24576 #define IS_LOOKING_W(HEADING) HEADING > 24576 && HEADING < 40960 #define IS_LOOKING_NW(HEADING) HEADING == 40960 #define MAX_FACE_DIRECTION 7 #define CALC_AND_RET_FACE_DIRECTION(N_FACE_DIRECTION, N_E_S_W) N_FACE_DIRECTION = (FaceDirection)(N_FACE_DIRECTION + N_E_S_W);printf("%d\n", N_FACE_DIRECTION);N_FACE_DIRECTION = (N_FACE_DIRECTION > MAX_FACE_DIRECTION ? (FaceDirection)(N_FACE_DIRECTION - INVALID) : N_FACE_DIRECTION);printf("%d\n", N_FACE_DIRECTION);return N_FACE_DIRECTION enum NESW { N = 0, NW = 1, W = 2, SW = 3, S = 4, SE = 5, E = 6, NE = 7 }; enum FaceDirection { FRONT = 0, FRONT_RIGHT = 1, RIGHT = 2, BEHIND_RIGHT = 3, BEHIND = 4, BEHIND_LEFT = 5, LEFT = 6, FRONT_LEFT = 7, INVALID = 8 }; FaceDirection getFaceDirection(int srcX, int srcY, int targetX, int targetY, NESW targetHeading) { FaceDirection faceDirection = INVALID; int differenceX = abs(abs(targetX - srcX)); int differenceY = abs(abs(targetY - srcY)); int rectInfoY = differenceX * 2; if (srcY < (targetY - rectInfoY)) { faceDirection = FRONT; CALC_AND_RET_FACE_DIRECTION(faceDirection, targetHeading); } else if (srcY > (targetY + rectInfoY)) { faceDirection = BEHIND; CALC_AND_RET_FACE_DIRECTION(faceDirection, targetHeading); } int rectInfoX = differenceY * 2; if (srcX < (targetX - rectInfoX)) { faceDirection = LEFT; CALC_AND_RET_FACE_DIRECTION(faceDirection, targetHeading); } else if (srcX > (targetX + rectInfoX)) { faceDirection = RIGHT; CALC_AND_RET_FACE_DIRECTION(faceDirection, targetHeading); } if (srcX < targetX && srcY < targetY) { faceDirection = FRONT_LEFT; CALC_AND_RET_FACE_DIRECTION(faceDirection, targetHeading); } else if (srcX < targetX && srcY > targetY) { faceDirection = BEHIND_LEFT; CALC_AND_RET_FACE_DIRECTION(faceDirection, targetHeading); } else if (srcX > targetX && srcY > targetY) { faceDirection = BEHIND_RIGHT; CALC_AND_RET_FACE_DIRECTION(faceDirection, targetHeading); } else if (srcX > targetX && srcY < targetY) { faceDirection = FRONT_RIGHT; CALC_AND_RET_FACE_DIRECTION(faceDirection, targetHeading); } return INVALID; } NESW getNESW(unsigned int heading) { if (IS_LOOKING_N(heading)) return N; else if (IS_LOOKING_NW(heading)) return NW; else if (IS_LOOKING_W(heading)) return W; else if (IS_LOOKING_SW(heading)) return SW; else if (IS_LOOKING_S(heading)) return S; else if (IS_LOOKING_SE(heading)) return SE; else if (IS_LOOKING_E(heading)) return E; else if (IS_LOOKING_NE(heading)) return NE; } int main(int argc, char **argv) { FaceDirection fd = INVALID; printf("%d\n", fd); for (;;) { int sX = rand() % 50 - 25; int sY = rand() % 50 - 25; fd = getFaceDirection(sX, sY, 0, 0, NE); printf("sX: %d\tsY: %d\ttX: %d\ttY: %d\ttHeading: %d\t->\t%d\n", sX, sY, 0, 0, 50000, fd); Sleep(1000); } return 0; }