카테고리 없음
[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 코사인 법칙을 찾아보시면 됩니다.
반응형