Creative Code

[7869번]두 원 본문

백준 문제풀이

[7869번]두 원

빛하루 2023. 9. 5. 23:26

https://www.acmicpc.net/problem/7869

 

7869번: 두 원

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

www.acmicpc.net

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#define PI 3.14159265358979

using namespace std;

int main() {
	double x1, y1, r1, x2, y2, r2;
	cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
	cout << fixed;
	cout.precision(8);
	double d = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
	if (r1 + r2 <= d) {
		cout << fixed;
		cout.precision(3);
		cout << 0.000 << '\n';
	}
	else if (d + min(r1, r2) <= max(r1, r2)) {
		cout << fixed;
		cout.precision(3);
		cout << min(r1, r2) * min(r1, r2) * PI << '\n';
	}
	else {
		double s = (r1 + r2 + d) / 2;
		double area = sqrt(s * (s - r1) * (s - r2) * (s - d));
		double h = 2 * area / d;
		double half_ceta = asin(h / r1);
		if (r2 * r2 > r1 * r1 + d * d) {
			half_ceta = PI - half_ceta;
		}
		double ceta = 2 * half_ceta;
		double a1 = ((1.0 / 2.0) * r1 * r1 * (ceta - sin(ceta)));
		half_ceta = asin(h / r2);
		if (r1 * r1 > r2 * r2 + d * d) {
			half_ceta = PI - half_ceta;
		}
		ceta = 2 * half_ceta;
		double a2 = ((1.0 / 2.0) * r2 * r2 * (ceta - sin(ceta)));
		cout << fixed;
		cout.precision(3);
		cout << a1 + a2 << '\n';
	}
}

'백준 문제풀이' 카테고리의 다른 글

[17214번]다항 함수의 적분  (0) 2023.09.06
[16496번]큰 수 만들기  (0) 2023.09.06
[2981번]검문  (0) 2023.09.04
[2447번]별 찍기-10  (0) 2023.09.03
[2225번]합분해  (0) 2023.09.02