struct Point_i {
int x, y;
Point_i() { x = y = 0; }
Point_i(int _x, int _y) : x(_x), y(_y) {}
}; // 좌표가 정수 값으로 주어질 때
struct Point {
double x, y;
Point() { x = y = 0.0; }
Point(double _x, double _y) : x(_x), y(_y) {}
bool operator < (Point p) const { // 연산자 재정의, EPS : 1e^-9와 같은 아주 작은 값 (문제에 따라 오차 범위 지정)
if (fabs(x - p.x) > EPS) return x < p.x; // fabs() : double 자료형의 절대값
return y < p.y;
}
bool operator == (Point p) const {
return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
} // 두 점이 서로 같은지 비교
}; // 좌표가 실수 값으로 주어질 때
double hypot(double x, double y) { return sqrt(x * x + y * y); }
// 피타고라스의 정리에 의하여 z = root(x^2 + y^2)
double dist(Point p1, Point p2) { return hypot(p1.x - p2.x, p1.y - p2.y); }
// Get Euclidean Distance
Point rotate(Point p, double theta) {
double rad = theta * (PI / 180.0); // degree를 radian으로 변환!
// deg = rad * (180.0 / PI)
return Point(p.x * cos(rad) - p.y * sin(rad), p.x * sin(rad) + p.y * cos(rad));
} // p를 원점(0, 0)을 중심으로 반시계 방향으로 theta도 회전한다.