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.
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.
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.
2 2 3 0 0 0 0 2 3 0 0 5 0
Case #1: 15.707963Case #2: 2.250778
给出两个内径和外径都相同的圆环,求出他们相交的面积
输入:r代表内径,R代表外径 (x1,y1)(x2,y2)两个圆环的圆心输出:输出相交的面积解题思路这个有了两圆相交的面积的模板,所思路一下就变得非常简单,就是两个大圆相交的面积(tmp)减去大圆和小圆相交的面积的二倍(tmp1)加上两个小圆相交的面积(tmp2);ans=tmp-tmp1*2+tmp2;#include <iostream> #include <cstdio> #include <cmath> using namespace std; double PI=acos(-1.0); double eps=1e-8; struct point { double x,y; }a,b,c,d; double dist(point a,point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double area(point c1,double r1,point c2,double r2) { double d=dist(c1,c2); if(r1+r2<d+eps) return 0; if(d<fabs(r1-r2)+eps) { double r=min(r1,r2); return PI*r*r; } double x=(d*d+r1*r1-r2*r2)/(2*d); double t1=acos(x/r1); double t2=acos((d-x)/r2); return r1*r1*t1+r2*r2*t2-d*r1*sin(t1); } int main() { int T; scanf("%d",&T); int cas=0; while(T--) { cas++; int r,R; scanf("%d%d",&r,&R); scanf("%lf%lf",&a.x,&a.y); scanf("%lf%lf",&b.x,&b.y); r=(double)r*1.0; R=(double)R*1.0; double ans=area(a,R,b,R); //double tmp1=area(a,R,b,r); double tmp11=area(a,r,b,R); double tmp2=area(a,r,b,r); //printf("%.8lf %.8lf %.8lf %.8lf\n",ans,tmp1,tmp11,tmp2); printf("Case #%d: %.6lf\n",cas,ans+tmp2-tmp11-tmp11); } return 0; }

547

被折叠的 条评论
为什么被折叠?



