All pastes #620712 Raw Edit

Someone

public c v1 · immutable
·published 2007-07-15 18:14 UTC
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;}