ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 코사인 법칙을 찾아보시면 됩니다.

    반응형

    댓글

Designed by Tistory.