HDU 5120 两圆环覆盖的面积(几何)
2015-10-04 20:23
441 查看
Intersection
Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)Total Submission(s): 1340 Accepted Submission(s): 516
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
2 2 3 0 0 0 0 2 3 0 0 5 0
[align=left]Sample Output[/align]
Case #1: 15.707963 Case #2: 2.250778
[align=left]Source[/align]
2014ACM/ICPC亚洲区北京站-重现赛(感谢北师和上交)
[align=left]Recommend[/align]
liuyiding | We have carefully selected several similar problems for you: 5498 5497 5496 5495 5494
此题题意是让求两个圆心坐标不同但内径和外径相同的的两个圆环,相交覆盖的面积
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define eps 1e-9 #define PI acos(-1) using namespace std; struct Point { double x,y; Point(){}; Point(double a,double b) { x=a,y=b; } Point operator - (const Point a)const { return Point(x-a.x,y-a.y); } double operator *(const Point a)const { return x*a.x+y*a.y; } }; double dist(Point a,Point b) { return sqrt((a-b)*(a-b)); } double Area(Point a,double r1,Point b,double r2) { double k=dist(a,b); if(k+eps>=r1+r2) //相切或相离 return 0; if(k<=fabs(r1-r2)+eps) //大圆包含小圆 ,eps应该放在<后 { double Min=min(r1,r2); return PI*Min*Min; } double x=(k*k+r1*r1-r2*r2)/(2.0*k); double j1=acos(x/r1); //直角三角形 double j2=acos((k-x)/r2); return (j1*r1*r1+j2*r2*r2-k*r1*sin(j1)); } int main() { int T; while(~scanf("%d",&T)) { int Case=0; while(T--) { double r,R; Point C1,C2; Case++; scanf("%lf%lf",&r,&R); scanf("%lf%lf%lf%lf",&C1.x,&C1.y,&C2.x,&C2.y); double area=Area(C1,R,C2,R)+Area(C1,r,C2,r)-2*Area(C1,r,C2,R); printf("Case #%d: ",Case); printf("%.6lf\n",area); } } }
相关文章推荐
- VLAN tag格式
- Matlab-vision包学习-Feature Detection,Extraction and Matching-BRISK角点检测
- JavaIO
- 2015年4月腾讯校招实习生(后台开发)面试经验(一面二面三面)
- 写在开头的话
- 1001位知乎姑娘
- linux后台开发必看书
- 三角形设计测试用例
- Codeforces Round #323 (Div. 2) C.GCD Table
- 论人应该追求什么:自由的关系
- [LeetCode]Contains Duplicate
- ZOJ 3209 Treasure Map (DLX精确覆盖问题)
- 图片下载-同步/异步(delegate和block)
- Android数据存储与IO
- MMD_4b_SVD
- AudioListener.volume = 0.0f;
- $.post .click
- Python 进程管理工具 Supervisor 使用教程
- Delphi中的循环结构
- iOS控件的缩放,平移,旋转和回到原点