[백준(Baekjoon)][자바(java)] 7869 : 두 원 / 기하

728x90

 

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

 

7869번: 두 원

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

www.acmicpc.net

 

문제 풀이

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		double xyr[][] = new double[2][3]; int i, j;
		for (i = 0; i < 2; ++i)
			for (j = 0; j < 3; ++j)
				xyr[i][j] = Double.parseDouble(st.nextToken());
		br.close();
		if (xyr[0][2] < xyr[1][2]) { // r1이 r2보다 더 큰 수가 되도록 swap
			double tmp[] = xyr[0]; xyr[0] = xyr[1]; xyr[1] = tmp;
		}
		double r1 = xyr[0][2], r2 = xyr[1][2];
		double d = Math.sqrt(Math.pow(xyr[0][0] - xyr[1][0], 2) + Math.pow(xyr[0][1] - xyr[1][1], 2));
		double res;
		if (r1 + r2 <= d)			// 서로 만나지 않거나 외접함
			res = 0;
		else if (r1 - r2 >= d)	// 서로 만나지 않거나 내접함 ( 큰 원 안에 작은 원이 있음 )
			res = r2 * r2 * Math.PI;
		else { 					// 두 원이 서로 겹침
			double theta1 = 2 * Math.acos((r1 * r1 + d * d - r2 * r2) / (2 * r1 * d));
			double theta2 = 2 * Math.acos((r2 * r2 + d * d - r1 * r1) / (2 * r2 * d));
			double s1 = (r1 * r1) * (theta1 - Math.sin(theta1)) / 2;
			double s2 = (r2 * r2) * (theta2 - Math.sin(theta2)) / 2;
			res = s1 + s2;
		}
		System.out.println(String.format("%.3f", res));
	}
}

 


 

■   두 점 사이의 거리  ( x1, y1 ) ~ ( x2, y2 )

 

■   두 원의 위치 관계

-  R1과 R2가 서로 외부에 있거나 외접하면 겹치는 부분이 없음
-  R1 내부에 R2가 있는 경우 R2의 넓이만큼 겹침 
-  나머지 경우에는 두 원이 두 점에서 만나며 겹치는 부분이 존재

 

■   원의 넓이

 

■   두 원이 겹치는 부분의 넓이

A  =  S1  +  S2

S1  =  (각도가 θ1 인 부채꼴 넓이)  -  (각도가 θ1 인 이등변삼각형 넓이)

S2  =  (각도가 θ2 인 부채꼴 넓이)  -  (각도가 θ2 인 이등변삼각형 넓이)

 

■   부채꼴의 넓이

 

■   이등변삼각형의 넓이

 

■   코사인 법칙

 


 

<   두 원의 각각의 중심에서부터 두 원이 만나는 두 점을 이은 부채꼴의 각도 구하기  >

 

 

 *   θ1  구하기

theta1  =  2 * Math.acos( ( r1 * r1 + d * d - r2 * r2 ) / ( 2 * r1 * d ) )

 

 *   θ2  구하기

theta2  =  2 * Math.acos( ( r2 * r2 + d * d - r1 * r1 ) / ( 2 * r2 * ) )

 


 

<  겹치는 부분의 넓이 (부채꼴의 넓이에서 이등변삼각형의 넓이를 뺀 값) 구하기 >

 

S1  =  ( r1 * r1 ) * ( theta1 - Math.sin( theta1 ) ) / 2
S2  =  ( r2 * r2 ) * ( theta2 - Math.sin( theta2 ) ) / 2

A  =  S1 + S2

 


 

 

반응형