카테고리 없음

[Algorithm] 백준 7869 두 원 - 삼각함수

허스크 2023. 11. 30. 17:18
반응형
 

7869번: 두 원

첫째 줄에 두 원의 중심과 반지름 x1, y1, r1, x2, y2, r2가 주어진다. 실수는 최대 소수점 둘째자리까지 주어진다.

www.acmicpc.net

#include <iostream>
#include <cmath>
using namespace std;

const double PI = 3.14159265358979f;

double GetDistance(double x1, double y1, double x2, double y2)
{
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main()
{
    double x1, y1, r1;
    double x2, y2, r2;

    cin >> x1 >> y1 >> r1;
    cin >> x2 >> y2 >> r2;
    cout << fixed;
    cout.precision(3);

    double d = GetDistance(x1, y1, x2, y2);

    if(d >= r1 + r2)
    {
        cout << "0.000\n";
        return 0;
    }

    if(d + min(r1, r2) <= max(r1, r2))
    {
        double MinRadius = min(r1, r2);
        cout << MinRadius * MinRadius * PI << '\n';
        return 0;
    }

    double t1 = (acos((r1 * r1 - r2 * r2 + d * d) / (2 * r1 * d))) * 2;
    double t2 = (acos((r2 * r2 - r1 * r1 + d * d) / (2 * r2 * d))) * 2;

    double s1 = r1 * r1 * (t1 - sin(t1)) / 2;
    double s2 = r2 * r2 * (t2 - sin(t2)) / 2;

    cout << s1 + s2 << '\n';
}

코드가 좀 많이 더럽긴 하지만...풀고 싶은 문제가 보여 풀게 되었습니다.

삼각함수를 통해 삼각형의 각을 구한 뒤 활꼴의 넓이를 구하는 문제였습니다.

위 낙서를 바탕으로 식을 만들게 되었는데 관련되어서는 제 2 코사인 법칙을 찾아보시면 됩니다.

반응형