개요
타원이 하나 주어져 있다고 가정해 봅시다. 타원은 중심 좌표 (h, k), 장반축(semi-major axis) a, 단반축(semi-minor axis) b로 정의됩니다. 여기에 임의의 점 (x, y)가 하나 더 주어졌을 때, 이 점이 타원의 내부에 있는지, 외부에 있는지, 아니면 경계선 위에 있는지 판별하는 것이 목표입니다.
이 문제는 다음 부등식을 활용하면 간단하게 해결할 수 있습니다.
$$\frac{\left(x-h\right)^2}{a^2}+\frac{\left(y-k\right)^2}{b^2}\leq1$$
주어진 점 (x, y)를 위 식에 대입했을 때 결과값에 따라 판별 기준은 다음과 같습니다.
- 결과값 1보다 작으면 → 점은 타원의 내부에 있습니다.
- 결과값 1과 같으면 → 점은 타원의 경계선 위에 있습니다.
- 결과값 1보다 크면 → 점은 타원의 외부에 있습니다.
구현 시 주의 사항
실수 연산의 정밀도를 높이기 위해 계산 결과는 double형으로 저장하는 것이 좋습니다. 정수형으로 선언하면 소수점 이하가 잘려나가 경계 판별이 부정확해질 수 있습니다.
C++ 구현 예제
#include <iostream>
#include <cmath>
using namespace std;
double isInsideEllipse(int h, int k, int x, int y, int a, int b) {
double res = (pow((x - h), 2) / pow(a, 2)) + (pow((y - k), 2) / pow(b, 2));
return res;
}
int main() {
int x = 2, y = 1, h = 0, k = 0, a = 4, b = 5;
if(isInsideEllipse(h, k, x, y, a, b) > 1){
cout << "Outside Ellipse";
}
else if(isInsideEllipse(h, k, x, y, a, b) == 1){
cout << "On the Ellipse";
} else{
cout << "Inside Ellipse";
}
}실행 결과
Inside Ellipse
코드 설명
위 예제에서 타원의 중심은 (0, 0)이고, 장반축 a는 4, 단반축 b는 5입니다. 점 (2, 1)을 식에 대입하면 다음과 같이 계산됩니다.
$$\frac{(2-0)^2}{4^2}+\frac{(1-0)^2}{5^2}=\frac{4}{16}+\frac{1}{25}=0.25+0.04=0.29$$
계산 결과인 0.29는 1보다 작으므로, 점 (2, 1)은 타원의 내부에 있다는 것을 확인할 수 있습니다. 따라서 프로그램은 "Inside Ellipse"를 출력합니다.