• POJ2546 Circular Area(计算几何)


                                                                                Circular Area
                                                           Time Limit: 1000MS  Memory Limit: 65536K
     

    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
     
     
    这道题直接上模板就可以了~
     
    模板:
     
    struct Circle{
        double x, y, r;
    };
    //圆的圆心坐标,半径
    
    double dis(Circle a, Circle b){
        return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    }
    //两圆圆心的距离
    
    double solve(Circle a, Circle b){
        double d = dis(a, b);
        if (d >= a.r + b.r) return 0;
        if (d <= fabs(a.r - b.r)){
            double r = a.r < b.r ? a.r : b.r;
            return pi * r * r;
        }
    
        double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2.00 / a.r / d);
        double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2.00 / b.r / d);
        double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1);
        return ret;
    }
    //返回值即为两圆公共部分的面积
     
     
    POJ2546:
     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define pi    3.1415926535897932384626
     6 
     7 struct Circle{
     8     double x, y, r;
     9 } r[31];
    10 
    11 double dis(Circle a, Circle b){
    12     return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    13 }
    14 
    15 double solve(Circle a, Circle b){
    16     double d = dis(a, b);
    17     if (d >= a.r + b.r) return 0;
    18     if (d <= fabs(a.r - b.r)){
    19         double r = a.r < b.r ? a.r : b.r;
    20         return pi * r * r;
    21     }
    22 
    23     double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2.00 / a.r / d);
    24     double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2.00 / b.r / d);
    25     double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1);
    26     return ret;
    27 }
    28 
    29 int main(){
    30 
    31     while (~scanf("%lf%lf%lf%lf%lf%lf", &r[0].x, &r[0].y, &r[0].r, &r[1].x, &r[1].y, &r[1].r))
    32         printf("%.3f
    ", solve(r[0], r[1]));
    33         
    34     return 0;
    35 
    36 }
  • 相关阅读:
    ID的插入
    开发语言的选择
    象数据库一样连接EXCEL
    前端,你真的了解JavaScript吗?
    开源软件与自由软件
    在codeigniter中使用Cache_Lite来缓存
    使用Codeigniter的SMTP类发Email
    JavaScript变量和数据类型
    JavaScript的隐式声明和变量声明提升的总结
    ASCII和UNICODE编码以及UTF8,你懂的?
  • 原文地址:https://www.cnblogs.com/cxhscst2/p/6392555.html
Copyright © 2020-2023  润新知