여러 소스를 보았지만 가장 완벽한 소스는 아래와 같습니다.
출처 : 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
'C/C++언어' 카테고리의 다른 글
[C/C++] atan2(double y, double x) 함수 (0) | 2013.12.19 |
---|---|
printf의 흔하진 않지만 때론 굉장히 필요한 포맷들 (0) | 2013.10.23 |
memcpy에 대한 고찰... (0) | 2012.11.27 |
간단한 텍스트 뒤집기, 메모리 복사 함수 (0) | 2012.10.19 |
[ VC11-C++11 ] range base for - 1 (0) | 2012.09.24 |