문제 개요
두 개의 원, 즉 각각의 중심 좌표와 반지름 값이 주어졌을 때, 한 원이 다른 원 안에 들어가는지 확인해야 합니다. 이때 가능한 경우는 세 가지입니다.
첫 번째 경우: 작은 원이 큰 원 안에 완전히 들어가 있지만 서로 닿지 않는 경우입니다. 이때 두 중심 사이의 거리와 작은 원의 반지름을 더한 값이 큰 원의 반지름보다 작기 때문에, 작은 원은 큰 원의 내부에 온전히 위치하게 됩니다.
두 번째 경우: 작은 원이 큰 원 안에 들어가 있으면서 동시에 큰 원의 둘레(원주)에 닿아 있는 경우입니다.
세 번째 경우: 작은 원의 일부만 큰 원 안에 걸쳐 있는 경우입니다.
이 문제를 해결하려면 먼저 피타고라스 정리를 이용해 두 중심 사이의 거리를 계산한 뒤, 그 거리와 두 원의 반지름 값을 비교하여 위에서 설명한 경우들을 판별하면 됩니다.
예제 코드
#include <iostream>
#include <cmath>
using namespace std;
void isCircleInside(int x_big, int y_big, int x_small, int y_small, int r_big, int r_small) {
// 두 중심 사이의 거리 계산
int dist = sqrt(((x_big - x_small) * (x_big - x_small)) + ((y_big - y_small) * (y_big - y_small)));
if (dist + r_small == r_big)
cout << "큰 원 안에 있으며 원주에 닿아 있습니다" << endl;
else if (dist + r_small < r_big)
cout << "큰 원 안에 완전히 들어가 있습니다" << endl;
else
cout << "큰 원 안에 들어가 있지 않습니다" << endl;
}
int main() {
int x1 = 10, y1 = 8; // 큰 원의 중심
int x2 = 1, y2 = 2; // 작은 원의 중심
int r1 = 30, r2 = 10; // 큰 원과 작은 원의 반지름
isCircleInside(x1, y1, x2, y2, r1, r2);
}출력 결과
큰 원 안에 완전히 들어가 있습니다
동작 원리
위 코드에서는 (x_big - x_small)과 (y_big - y_small)의 제곱합에 제곱근을 적용하여 두 중심 사이의 유클리드 거리를 구합니다. 그다음 조건문을 통해 다음과 같이 판별합니다.
거리 + 작은 원의 반지름 == 큰 원의 반지름: 작은 원이 큰 원 내부에 있으면서 경계에 정확히 닿아 있는 상태입니다.
거리 + 작은 원의 반지름 < 큰 원의 반지름: 작은 원이 큰 원 안에 여유 공간을 두고 완전히 포함되어 있는 상태입니다.
그 외의 경우: 작은 원이 큰 원 밖으로 벗어나 있거나 일부만 겹치는 상태입니다.
예제에서는 큰 원의 중심이 (10, 8), 반지름이 30이고, 작은 원의 중심이 (1, 2), 반지름이 10입니다. 두 중심 사이의 거리는 약 10.82이며, 여기에 작은 원의 반지름 10을 더한 값이 30보다 작으므로 작은 원은 큰 원 안에 완전히 포함됩니다.