Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 한 원이 다른 원 안에 포함되어 있는지 확인하는 방법

문제 개요

두 개의 원, 즉 각각의 중심 좌표와 반지름 값이 주어졌을 때, 한 원이 다른 원 안에 들어가는지 확인해야 합니다. 이때 가능한 경우는 세 가지입니다.

  • 첫 번째 경우: 작은 원이 큰 원 안에 완전히 들어가 있지만 서로 닿지 않는 경우입니다. 이때 두 중심 사이의 거리와 작은 원의 반지름을 더한 값이 큰 원의 반지름보다 작기 때문에, 작은 원은 큰 원의 내부에 온전히 위치하게 됩니다.

  • 두 번째 경우: 작은 원이 큰 원 안에 들어가 있으면서 동시에 큰 원의 둘레(원주)에 닿아 있는 경우입니다.

  • 세 번째 경우: 작은 원의 일부만 큰 원 안에 걸쳐 있는 경우입니다.

이 문제를 해결하려면 먼저 피타고라스 정리를 이용해 두 중심 사이의 거리를 계산한 뒤, 그 거리와 두 원의 반지름 값을 비교하여 위에서 설명한 경우들을 판별하면 됩니다.

예제 코드

#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보다 작으므로 작은 원은 큰 원 안에 완전히 포함됩니다.