원이 겹치지 않는 상황, 두 원이 완전히 겹치는 상황, 두 원이 걸쳐서 겹치는 상황으로 나누어 푸는 문제이다. 마지막 상황은 제2코사인 법칙을 이용하여 구해준다.
- 해당 상황에서 나올 수 있는 경우의 수로 첫번째 두 원이 겹치지 않을 상황에는 두 원의 중점 사이의 거리가 r1+r2보다 클 때이다. 해당 경우에는 0.000을 출력해준다.
- 두 번째 상황으로 원이 완전히 겹치게 되는 상황은 중점 사이의 거리 + r1,r2중 작은값이 r1,r2중 큰 값보다 작거나 같은 상황으로 해석할 수 있다. 이때는 반지름이 작은 원의 넓이를 계산하여 출력해준다.
- 마지막 상황으로 두 원이 걸쳐서 겹치는 상황에는 교점사이의 각 theta1과 theta2를 구하여 원의 넓이에서 삼각형의 넓이를 빼주면 풀 수 있게 된다. 이때 각 원의 theta를 구하기 위해 제2코사인 법칙을 이용하여 각 원의 theta를 구하여 계산을 해줄 수 있다.
import sys, math
input = sys.stdin.readline
x1, y1, r1, x2, y2, r2 = map(float,input().split())
pi = math.pi
d = math.sqrt((x2-x1)**2 + (y2-y1)**2)
if d > r1+r2 :
print(format(0, ".3f"))
elif d + min(r1,r2) <= max(r1,r2):
print(format(pi*(min(r1,r2)**2), ".3f"))
else :
theta1 = math.acos((d*d + r1*r1 - r2*r2)/ (2.0*d*r1))*2
theta2 = math.acos((d*d + r2*r2 - r1*r1)/ (2.0*d*r2))*2
S = (r1*r1*(theta1 - math.sin(theta1)) + r2*r2*(theta2- math.sin(theta2)))*0.5
print(format(S, ".3f"))