圓形相交,相切,相離,包含


 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM