rendered paste body#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <stdio.h>#include <stdlib.h>#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_DIRECTIONenum 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;}