여러 소스를 보았지만 가장 완벽한 소스는 아래와 같습니다.


출처 : http://borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=880 + 알파

#include <stdio.h>

#include <math.h>


#define round(x)        ((x) >= 0 ? (long)((x) + 0.5) : (long)((x) - 0.5))


int getInternalAngle(int ox, int oy, int px, int py, int qx, int qy)

{

    float oq = sqrt(pow(pointO.x - pointQ.x, 2) + pow(pointO.y - pointQ.y, 2));

    float op = sqrt(pow(pointO.x - pointP.x, 2) + pow(pointO.y - pointP.y, 2));

    float pq = sqrt(pow(pointP.x - pointQ.x, 2) + pow(pointP.y - pointQ.y, 2));


    if (op < 1 || pq < 1) {

        return 0;

    }


    float temp = (pow(op,2) + pow(pq,2) - pow(oq,2)) / (2*op*pq);


    float angle = acos(temp);

    angle = angle * (180 / M_PI);


    if (pointO.x != pointP.x) {

        float a = (pointP.y - pointO.y) / (pointP.x - pointO.x);

        float b = (pointP.x * pointO.y - pointO.x*pointP.y) / (pointP.x - pointO.x);

        float y = a * pointQ.x + b;

        if (a > 0) {

            if (pointQ.y > y) {

                angle = 360.0f - angle;

            }

        } else {

            if (pointQ.y < y) {

                angle = 360.0f - angle;

            }

        }

    } else {

        if (pointQ.x < pointP.x) {

            angle = 360.0f - angle;

        }

    }


    return round(angle);

}


int main()

{

    int ax,ay,bx,by,cx,cy;

    printf("점 A의 좌표를 입력하세요 : \n");

    scanf("%d%d",&ax,&ay);

    printf("점 B의 좌표를 입력하세요 : \n");

    scanf("%d%d",&bx,&by);

    printf("점 C의 좌표를 입력하세요 : \n");

    scanf("%d%d",&cx,&cy);

    printf("ABC의 각도는 %d도 입니다.\n",getInternalAngle(ax,ay,bx,by,cx,cy));


    return 0;

}



별거 없는데... 생각하는데 시간이 너무 들었네요.. orz

+ Recent posts