이 글에서는 주어진 선분이 원점(0, 0)을 지나는지 확인하는 방법을 알아보겠습니다. 선분의 양 끝점을 나타내는 두 개의 좌표가 주어졌을 때, 이 선분이 원점을 통과하는지 여부를 판별하는 것이 목표입니다.
접근 방법
핵심 아이디어는 매우 간단합니다. 두 끝점을 지나는 직선의 방정식을 세운 뒤, 그 식에 (0, 0)을 대입하여 등식이 성립하는지 확인하면 됩니다. 등식이 성립한다면 해당 직선은 원점을 지난다는 의미입니다.
선분의 두 끝점을 (x1, y1)과 (x2, y2)라고 하겠습니다. 이 두 점을 지나는 직선의 방정식은 다음과 같이 표현할 수 있습니다.
$$y-y_{1}=\left(\frac{y_{2}-y_{1}}{x_{2}-x_{1}}\right)*\lgroup x-x_{1}\rgroup+c$$
여기에 x = 0, y = 0을 대입하면 다음과 같은 조건식을 얻을 수 있습니다.
$$x_{1}\lgroup y_{2}-y_{1}\rgroup=y_{1}\lgroup x_{2}-x_{1}\rgroup$$
즉, 위 등식이 성립하면 선분은 원점을 통과하고, 성립하지 않으면 원점을 통과하지 않습니다. 이 조건만 코드로 구현하면 손쉽게 판별할 수 있습니다.
예제 코드
#include<iostream>
using namespace std;
bool checkPassOrigin(int x1, int y1, int x2, int y2) {
return (x1 * (y2 - y1) == y1 * (x2 - x1));
}
int main() {
if (checkPassOrigin(10, 0, 20, 0) == true)
cout << "Passes Through Origin";
else
cout << "Not Passing Through Origin";
}출력 결과
Passes Through Origin
위 예제에서는 (10, 0)과 (20, 0)이라는 두 점으로 선분을 정의했습니다. 두 점 모두 y좌표가 0이므로 이 선분은 x축 위에 놓여 있고, 당연히 원점도 지나게 됩니다. 따라서 프로그램은 "Passes Through Origin"(원점을 통과함)을 출력합니다.
이 방법은 부동소수점 연산 없이 정수 곱셈과 비교만으로 판별할 수 있어 계산이 단순하고 효율적입니다. 다만 실수 좌표를 다룰 경우에는 오차 범위(epsilon)를 고려한 비교를 사용하는 것이 좋습니다.