zoukankan      html  css  js  c++  java
  • 圆形相交,相切,相离,包含

    来自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
    ",s);
    53 
    54 
    55 
    56 
    57 
    58     return 0;
    59 }
  • 相关阅读:
    把我给另外一个朋友的炒股劝告发给你一遍,希望你可以得到帮助!
    Microsoft Office Document Imaging批量ocr 方法
    Advanced GET 9.1 修正汉化版(免注册、页面加载、保存都正常)
    波浪分析数据转换:大智慧、钱龙、胜龙可用Advanced GET ToGet 数据转换器V3.05特别版
    怎样精确计算股市主力的持仓量
    混沌理论
    地产联盟内部资料总目录
    C语言 · P1001(大数乘法)
    C语言 · 排列数
    C语言 · 逆序排列
  • 原文地址:https://www.cnblogs.com/wikioibai/p/4416075.html
Copyright © 2011-2022 走看看