hdu5120 两圆环相交 数学题

公式 A大B大-A大B小-A小B大+A小B小

#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>

#include<queue>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1 | 1
#define lowbit(x) x&(-x)
template <class T>
inline bool rd(T &ret){
    char c;int sgn;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-' && (c<'0' || c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0' && c<='9') ret=ret*10+(c-'0');
    ret*=sgn;
    return 1;
}
template <class T>
inline void pt(T x){
        if(x<0){
            putchar('-');
            x=-x;
        }
        if(x>9) pt(x/10);
        putchar(x%10+'0');
}
using namespace std;
typedef long long LL;
const int N=10005;
long long inf=1e15;
const int MOD=1e9+7;
int T,n,m,k,x,y,z,l,tot;
int cas=1;
double PI=acos(-1);
struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){
        x=_x;y=_y;
    }
    Point operator -(const Point&b){
        return Point(x-b.x,y-b.y);
    }
    double operator *(const Point &b){
        return x*b.x+y*b.y;
    }
};
double dis(Point c1,Point c2){
    return sqrt((c1-c2)*(c1-c2));
}
double calc(Point c1,double R,Point c2,double r){
    double d=dis(c1,c2);
    if(d>=r+R) return 0;
    if(d<=R-r) return r*r*PI;
    double ang1=   acos( (R*R+d*d-r*r)/(2*R*d));
    double ang2=   acos( (r*r+d*d-R*R)/(2*r*d));
    return ang1*R*R+ang2*r*r-d*R*sin(ang1);
}
int main()
{
#ifndef  ONLINE_JUDGE
 freopen("aaa","r",stdin);
#endif
    int T;
    scanf("%d",&T);
    while(T--){
    int r,R;
        rd(r);rd(R);
        Point c1,c2;
        rd(c1.x);rd(c1.y);
        rd(c2.x);rd(c2.y);
        double ans=calc(c1,R,c2,R)-calc(c1,R,c2,r)-calc(c2,R,c1,r)+calc(c1,r,c2,r);

        printf("Case #%d: %f\n",cas++,ans);

    }
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值