圆形相交,相切,相离,包含

 

来自BNU热身赛的一道几何题,个人感觉还行,毕竟Q神卡了7次才过去。。

E. School Flower

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name: Main

学校的草坪上最近种满了漂亮的鲜花,为了给这些花朵浇水,学校购置了两个用于灌溉的喷头。每个喷头都有一个喷射半径,可以给喷射半径内的植物浇水。草坪上的有些花恰只能被一个喷头灌溉;可能还些花会被两个喷头同时灌溉,这些花会生长的更旺盛。

现在,ch0588想请你帮忙计算下,能同时被两个喷头灌溉的面积有多大?(下图中红色面积为所求)

圆形相交,相切,相离,包含

(上图红色部分为所求面积)

 

Input

输入数据只有两行实数,用空格隔开

x1 y1 r1

x2 y2 r2

分别代表两个第i个喷头的位置(xi,yi),和它的喷射半径ri。

(0<xi,yi,ri<1000.0)

 

 

Output

输出一行,题目描述中的所求面积(保留两位小数)

 

Sample Input

1.0 3.0 3.0

1.0 8.0 4.0

Sample Output

6.64

Hint

π的值请取:3.1415926

解题思路:

  思路上没有什么难的,主要是讨论两个圆的各种位置关系,然后得到我们需要的结果。。。

相离和包含可以直接写,但是相交的话,要手推公式了。

 

代码:

 1 # include<cstdio>

 2 # include<iostream>

 3 # include<set>

 4 # include<cmath>

 5 # include<iomanip>

 6 

 7 using namespace std;

 8 

 9 # define PI 3.1415926

10 

11 int main(void)

12 {

13     double x1,y1,r1;

14     double x2,y2,r2;

15     cin>>x1>>y1>>r1;

16     cin>>x2>>y2>>r2;

17 

18     double s;

19     double r_ans = fabs(r2-r1);

20 

21     double d = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));

22     if ( d >= r1+r2 )

23     {//相离

24         s = 0.00;

25     }

26     else if ( d <= r_ans )

27     {//内含

28         if ( r2 >= r1 )

29         {

30             s = PI*r1*r1;

31         }

32         else

33         {

34             s = PI*r2*r2;

35         }

36     }

37     else

38     {//相交

39         double a,aa;

40         double b,bb;

41         a = (r1*r1+(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)-r2*r2)/(2*r1*d);

42         aa = 2*acos(a);

43         b = (r2*r2+(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)-r1*r1)/(2*r2*d);

44         bb = 2*acos(b);

45         double s1 = r1*r1*sin(aa)/2;

46         double s2 = r2*r2*sin(bb)/2;

47         double s3 = r1*r1*aa/2;

48         double s4 = r2*r2*bb/2;

49         s = s3-s1+s4-s2;

50 

51     }

52     printf("%.2f\n",s);

53 

54 

55 

56 

57 

58     return 0;

59 }

 

你可能感兴趣的:(包)