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

 

来自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 }

 

posted @ 2015-04-11 00:52  BYYB_0506  阅读(3159)  评论(0编辑  收藏  举报