zoukankan      html  css  js  c++  java
  • poj 2546 Circular Area(两个圆相交的面积)

    Circular Area
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 5716   Accepted: 2239

    Description

    Your task is to write a program, which, given two circles, calculates the area of their intersection with the accuracy of three digits after decimal point.

    Input

    In the single line of input file there are space-separated real numbers x1 y1 r1 x2 y2 r2. They represent center coordinates and radii of two circles.

    Output

    The output file must contain single real number - the area.

    Sample Input

    20.0 30.0 15.0 40.0 30.0 30.0

    Sample Output

    608.366
    

    Source

    Northeastern Europe 2000, Far-Eastern Subregion
     
     
    题意:给第一个圆的圆心坐标和半径,再给第二个圆的圆心坐标和半径,求两个圆的相交面积。
     
    几何题,刚开始接触,照着别人代码理解完成自己的代码。
     
    两种情况一次分析就好,情况相同~
    附上代码:
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #define ll long long
     6 #define M 100005
     7 using namespace std;
     8 
     9 const double  pi = acos(-1.0);
    10 
    11 struct Round
    12 {
    13     double x,y;
    14     double r;
    15 } rr[2];
    16 
    17 double dis(Round a, Round b)
    18 {
    19     return sqrt((a.x - b.x)*(a.x - b.x)+(a.y - b.y)*(a.y - b.y)); ///求两点之间的距离
    20 }
    21 
    22 double solve(Round a, Round b)
    23 {
    24     double d = dis(a, b);
    25     if(d >= a.r + b.r)  ///相离的情况
    26         return 0;
    27     else if(d <= fabs(a.r - b.r)) ///内含的情况
    28     {
    29         double r = a.r < b.r?a.r : b.r;
    30         return pi*r*r;
    31     }
    32     double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2.0 / a.r / d); 
    33     ///公式: cos(A)=(b^2+c^2-a^2)/2bc acos(cos(A))求出角A的弧度
    34     double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2.0 / b.r / d);
    35     double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1);
    36     ///扇形面积s=弧度*r^2/2 三角形面积=a*b*sin(A)/2
    37     return ret;
    38 }
    39 
    40 int main()
    41 {
    42     while(~scanf("%lf%lf%lf%lf%lf%lf",&rr[0].x,&rr[0].y,&rr[0].r,&rr[1].x,&rr[1].y,&rr[1].r))
    43     {
    44         printf("%.3lf
    ",solve(rr[0], rr[1]));
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    H3C交换机流量镜像
    脚本引发的思考
    【PAT Advanced Level】1015. Reversible Primes (20)
    JSTL自定义函数完成ACL即时认证
    [翻译Joel On Software]选择一门语言/Choosing a language
    MFC-CWinApp
    poj2462
    HDU 3472 混合图欧拉回路 + 网络流
    Vim命令合集
    Windows下SQLMAP的安装图解
  • 原文地址:https://www.cnblogs.com/pshw/p/5711251.html
Copyright © 2011-2022 走看看