이 글에서는 C++ STL에서 제공하는 complex 클래스를 활용하여 점(Point) 클래스를 만드는 방법을 살펴보고, 이를 기하학 관련 문제에 적용해 보겠습니다. 복소수는 STL의 complex 헤더(#include <complex>)에 포함되어 있어 별도의 구현 없이 바로 사용할 수 있습니다.
Point 클래스 정의하기
복소수를 점처럼 다루기 위해 complex<double> 타입에 point라는 이름을 붙이고, 복소수 클래스의 real() 함수를 x좌표로, imag() 함수를 y좌표로 매핑합니다. 이렇게 하면 별도의 클래스를 작성하지 않고도 점 클래스를 흉내 낼 수 있습니다.
#include <complex> typedef complex<double> point; #define x real() #define y imag()
주의할 점은 x와 y가 매크로로 정의되었기 때문에 일반적인 멤버 변수처럼 취급할 수 없다는 것입니다. 즉, x와 y에 값을 직접 대입하는 것은 불가능하며, 오직 좌표를 읽어오는 용도로만 사용해야 합니다.
예제 코드
다음 예제를 통해 실제 동작을 확인해 보겠습니다.
#include <iostream>
#include <complex>
using namespace std;
typedef complex<double> point;
#define x real()
#define y imag()
int main() {
point my_pt(4.0, 5.0);
cout << "The point is :" << "(" << my_pt.x << ", " << my_pt.y << ")";
}실행 결과
The point is :(4, 5)
기하학 연산에 활용하기
복소수 기반의 점 클래스는 기하학 문제에서 유용하게 활용됩니다. 대표적인 연산은 다음과 같습니다.
- 원점으로부터의 거리: 점 P와 원점 (0, 0) 사이의 거리는
abs(P)로 구할 수 있습니다. - X축과 이루는 각도: 원점 O에서 점 P로 향하는 선분 OP가 X축과 이루는 각도(편각)는
arg(P)로 계산됩니다. - 점의 회전: 원점을 중심으로 점 P를 회전시키려면
P * polar(r, θ)를 사용합니다. 여기서 r은 크기, θ는 회전 각도입니다.
응용 예제
거리 계산, 각도 계산, 그리고 90도 회전을 한 번에 수행하는 예제입니다.
#include <iostream>
#include <complex>
#define PI 3.1415
using namespace std;
typedef complex<double> point;
#define x real()
#define y imag()
void print_point(point my_pt){
cout << "(" << my_pt.x << ", " << my_pt.y << ")";
}
int main() {
point my_pt(6.0, 7.0);
cout << "The point is:" ;
print_point(my_pt);
cout << endl;
cout << "Distance of the point from origin:" << abs(my_pt) << endl;
cout << "Tangent angle made by OP with X-axis: (" << arg(my_pt) << ") rad = (" << arg(my_pt)*(180/PI) << ")" << endl;
point rot_point = my_pt * polar(1.0, PI/2);
cout << "Point after rotating 90 degrees counter-clockwise, will be: ";
print_point(rot_point);
}실행 결과
The point is:(6, 7) Distance of the point from origin:9.21954 Tangent angle made by OP with X-axis: (0.86217) rad = (49.4002) Point after rotating 90 degrees counter-clockwise, will be: (-6.99972, 6.00032)
위 결과에서 확인할 수 있듯이, 점 (6, 7)의 원점으로부터 거리는 약 9.22이며, X축과 이루는 각도는 약 49.4도입니다. 또한 반시계 방향으로 90도 회전한 결과는 (-6.99972, 6.00032)로, PI 값을 3.1415로 근사했기 때문에 이론값인 (-7, 6)과 아주 미세한 오차가 발생한 것을 알 수 있습니다. 더 높은 정밀도가 필요하다면 acos(-1)을 사용해 PI 값을 정의하는 것이 좋습니다.
이처럼 STL의 complex 클래스를 점 클래스로 활용하면 벡터 덧셈, 뺄셈, 스칼라 곱, 내적·외적 계산 등 다양한 기하학 연산을 코드 수정 없이 자연스럽게 처리할 수 있어, 경진 프로그래밍에서 기하학 문제를 풀 때 특히 유용합니다.