[几何数学] Intersection HDU - 5120 2014 北京ICPC

Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The following figures are some famous examples you may know.

A ring is a 2-D figure bounded by two circles sharing the common center. The radius for these circles are denoted by r and R (r < R). For more details, refer to the gray part in the illustration below.

Matt just designed a new logo consisting of two rings with the same size in the 2-D plane. For his interests, Matt would like to know the area of the intersection of these two rings.
Input
The first line contains only one integer T (T ≤ 10 5), which indicates the number of test cases. For each test case, the first line contains two integers r, R (0 ≤ r < R ≤ 10).

Each of the following two lines contains two integers x i, y i (0 ≤ x i, y i ≤ 20) indicating the coordinates of the center of each ring.
Output
For each test case, output a single line “Case #x: y”, where x is the case number (starting from 1) and y is the area of intersection rounded to 6 decimal places.

Sample Input
2
2 3
0 0
0 0
2 3
0 0
5 0
Sample Output
Case #1: 15.707963
Case #2: 2.250778

给了2个半径。。。 然后2行圆心坐标
求相交圆环的面积

纯粹数学题

打错一个字母wa了 3发 醉了醉了
代码丑 见谅 懒得改了

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;

const int maxn = 1<<20;
const int mod = 1e9+7;
const int INF = 0x3f3f3f3f;
const double PI=acos(-1);

int t,n,m;
double x1,yy1,x2,yy2;
double r1,r2;

double ras(int x1,int yy1,int x2,int yy2,int r1,int r2) {
    double S;
    double D=sqrt((x1-x2)*(x1-x2)+(yy1-yy2)*(yy1-yy2));

    double R=max(r1,r2);
    double r=min(r1,r2);

    if(D>=r1+r2) return 0;
    if(D<=R-r) return r*r*PI;

    double Angle_a=acos((D*D+R*R-r*r)/(2*D*R));

    double Sjia_a=sin(Angle_a)*R*R*cos(Angle_a);
    double Ssan_a=R*R*Angle_a;
    double Angle_b=acos((D*D+r*r-R*R)/(2*D*r));
    double Sjia_b=sin(Angle_b)*r*r*cos(Angle_b);
    double Ssan_b=r*r*Angle_b;
    return Ssan_a-Sjia_a+Ssan_b-Sjia_b;
}

int main() {
    scanf("%d",&t);
    int cas=1;
    while(t--) {
        scanf("%lf %lf",&r1,&r2);
        scanf("%lf %lf",&x1,&yy1);
        scanf("%lf %lf",&x2,&yy2);

        double ans=0;

        ans+=ras(x1,yy1,x2,yy2,r1,r1);

        ans-=ras(x1,yy1,x2,yy2,r1,r2);
        ans-=ras(x1,yy1,x2,yy2,r1,r2);

        ans+=ras(x1,yy1,x2,yy2,r2,r2);

        double D=sqrt((x1-x2)*(x1-x2)+(yy1-yy2)*(yy1-yy2));
        double R=max(r1,r2);
        double r=min(r1,r2);

        if(D==0) ans=R*R*PI-r*r*PI;

        printf("Case #%d: %lf\n",cas++,ans);
    }
    return 0;
}
全部评论

相关推荐

11-09 01:22
已编辑
东南大学 Java
高级特工穿山甲:羡慕,我秋招有家企业在茶馆组织线下面试,约我过去“喝茶详谈”😢结果我去了发现原来是人家喝茶我看着
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务