hdoj5120Intersection【求圆相交的面积】
来源:互联网 发布:检测到您的网络异常 编辑:程序博客网 时间:2024/06/04 18:52
Intersection
Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)Total Submission(s): 1254 Accepted Submission(s): 488
Problem Description
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.
Input
The first line contains only one integer T (T ≤ 105), 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 xi, yi (0 ≤ xi, yi ≤ 20) indicating the coordinates of the center of each ring.
Each of the following two lines contains two integers xi, yi (0 ≤ xi, yi ≤ 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
22 30 00 02 30 05 0
Sample Output
Case #1: 15.707963Case #2: 2.250778
给出两个同心圆的圆心坐标和同心圆半径求如图所示阴影面积
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#define PI acos(-1.0)#define eps 1e-8using namespace std;int sgn(double n){if(fabs(n)<eps)return 0;if(n<0)return -1;return 1;}double MIN(double a,double b){return a<b?a:b;}double dist(double x1,double y1,double x2,double y2){return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));}double getArea(double x1,double y1,double x2,double y2,double r1,double r2){double d=dist(x1,y1,x2,y2);if(sgn(d-r1-r2)>=0)return 0;//不相交if(sgn(d-fabs(r1-r2))<=0){//包含 double r=MIN(r1,r2);return PI*r*r;} double cos_r1=(d*d+r1*r1-r2*r2)/(2.0*d*r1);//利用余弦定理算角度 double angle1=acos(cos_r1);double cos_r2=(d*d+r2*r2-r1*r1)/(2.0*d*r2);double angle2=acos(cos_r2);return fabs(r1*r1*angle1-0.5*r1*r1*sin(angle1*2.0)+r2*r2*angle2-0.5*r2*r2*sin(2.0*angle2));//算相交的面积 }int main(){int t,n,i,j,k=1;double r,R,x1,x2,y1,y2;scanf("%d",&t);while(t--){scanf("%lf%lf",&r,&R);scanf("%lf%lf",&x1,&y1);scanf("%lf%lf",&x2,&y2);double big_circleinter=getArea(x1,y1,x2,y2,R,R);//两个大圆相交面积 double small_circleinter=getArea(x1,y1,x2,y2,r,r);//两个小圆相交面积 double small_big_circleinter=getArea(x1,y1,x2,y2,r,R);//小圆和大圆相交面积 printf("Case #%d: %.6lf\n",k++,big_circleinter-2.0*small_big_circleinter+small_circleinter);}return 0;}
0 0
- hdoj5120Intersection【求圆相交的面积】
- 求相交圆面积
- poj2546 求两个圆相交的面积
- 两圆相交,求相交的面积模板
- hdu2056(求相交的面积)
- 两圆相交求相交面积
- 两圆相交求面积
- 两圆相交求面积
- BNU4067:美丽的花环(求圆相交面积)
- hdu 5120 Intersection(求相交圆的面积)
- poj 2546 求2个圆相交的面积
- hdu 5120 Intersection(求相交圆的面积)
- 求两圆环相交部分的面积
- poj 2546 两圆相交求面积
- 求三角形外心,两圆相交面积
- 求矩形相交面积
- 三个圆的相交面积
- hdoj Intersection 5120 (数学计算几何) 求两个相交圆的面积
- eclipse中server location灰色,如何修改?
- C++实现单例模式
- 2013 Asia Regional Changchun
- 链表的多项式加法链表的多项式加法
- Eclipse中servlet显示无法导入javax.servlet包问题的解决方案
- hdoj5120Intersection【求圆相交的面积】
- 做了个戚风蛋糕
- POJ 2311 Cutting Game
- 3个线程顺序打印ABC10次
- awakeFromNib与viewDidLoad的区别
- 《幸运大转盘》代码分享
- c++设计模式----迭代器模式iterator
- AndroidStudio中使用NDK
- bfs实现二叉树按行有序输出