zoukankan      html  css  js  c++  java
  • hdu 5120(2014北京—求圆相交)

    题意:求环的相交面积

    思路:

    通过画图可知,面积= 大圆相交面积 - 大小圆相交面积*2 + 小小圆相交面积  再通过圆相交模板计算即可

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    #define PI 3.141592654
    double dis(double x1,double y1,double x2,double y2)
    {
        double x = (x1-x2)*(x1-x2);
        double y = (y1-y2)*(y1-y2);
        return sqrt(x + y);
    }
    
    double overload(int x1,int y1,int r1,int x2,int y2,int r2)   //r1^2 - x^2 = r2^2 - (len-x)^2
    {
        double len = dis(x1,y1,x2,y2);
        if (r1+r2<len + 1e-10) return 0;
        if (len<fabs(r1-r2+1e-10))
        {
            double r=min(r1,r2);
            return PI*r*r;
        }
        double x=(len*len+r1*r1-r2*r2)/(2*len);
        double t1=acos(x/r1);
        double t2=acos((len-x)/r2);
        return r1*r1*t1+r2*r2*t2-len*r1*sin(t1);
    
    }
    
    int main()
    {
        int T;
        int cas = 1;
        scanf("%d",&T);
        while(T--)
        {
            double x1,x2,y1,y2;
            double r,R;
            scanf("%lf%lf",&r,&R);
            scanf("%lf%lf",&x1,&y1);
            scanf("%lf%lf",&x2,&y2);
            double bb_area = overload(x1,y1,R,x2,y2,R);
            double bs_area = overload(x1,y1,R,x2,y2,r);
            double ss_area = overload(x1,y1,r,x2,y2,r);
            double ans = bb_area - bs_area*2 + ss_area;
            printf("Case #%d: %.6lf
    ",cas++,ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    C#编程总结(三)线程同步 多线程
    配置 Spring.NET
    C# Redis
    WPF MvvmLight RelayCommand 绑定Command 的使用
    WCF编程系列(一)初识WCF
    C#/WPF程序开机自动启动
    C# 创建Windows Service(Windows服务)程序
    前端Js框架汇总
    列式存储和行式存储
    llvm-3.4.2 编译失败 解决方案
  • 原文地址:https://www.cnblogs.com/Przz/p/5409728.html
Copyright © 2011-2022 走看看