hdu 5120 Intersection(求相交环面积)
2016-03-06 13:57
387 查看
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.
![](http://acm.hdu.edu.cn/data/images/C556-1009-1.jpg)
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.
![](http://acm.hdu.edu.cn/data/images/C556-1009-2.jpg)
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.
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
Sample Output
solution:
由容斥可得 两环相交面积=两大圆相交面积-2*一大圆与一小圆相交面积+两小圆相交面积
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.
![](http://acm.hdu.edu.cn/data/images/C556-1009-1.jpg)
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.
![](http://acm.hdu.edu.cn/data/images/C556-1009-2.jpg)
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.
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
solution:
由容斥可得 两环相交面积=两大圆相交面积-2*一大圆与一小圆相交面积+两小圆相交面积
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define pi acos(-1.0) struct node{ double x,y; } c[10]; double area(double r1, double rr) { int i = 0, j = 1; double d =sqrt((c[i].x - c[j].x)*(c[i].x - c[j].x) + (c[i].y - c[j].y)*(c[i].y - c[j].y));//圆心距 if (r1>rr){ double temp = r1; r1 = rr; rr = temp; }//r1取小 if (r1 + rr <= d) return 0;//相离 else if (rr - r1 >= d) return pi*r1*r1;//内含 else { double a1 = acos((r1*r1 + d*d - rr*rr) / (2.0*r1*d)); double a2 = acos((rr*rr + d*d - r1*r1) / (2.0*rr*d)); return (a1*r1*r1 + a2*rr*rr - r1*d*sin(a1)); }//相交 } int main() { int t; scanf("%d", &t); double r, rr; for (int k = 1; k <= t; k++) { scanf("%lf%lf", &r, &rr); for (int i = 0; i < 2; i++) scanf("%lf%lf", &c[i].x, &c[i].y); double ans = area(rr, rr)+area(r, r) - area(r, rr)*2.0; printf("Case #%d: %.6lf\n",k, ans); } }
相关文章推荐
- Ubuntu14.04下,GO语言的安装!
- 学习进度第一周
- 面向对象2
- 最近一周工作总结
- 将数组中的数循环移动k位
- 面向对象
- NBUT 1655-木块拼接【模拟】
- C语言格式化说明符
- week2--操作系统是如何工作的
- hdu 5122 K.Bro Sorting(单调栈)
- HDOJ 1045 Fire Net(DFS)
- 主席树的应用
- 关于srand()rand()的用法
- javascript实现网页定时跳转代码
- win7下ubuntu的安装(双系统)
- Android简易版天气预报app的现实(2)
- DOM,SAX,JDOM,DOM4J 四种方式解析xml
- 假期工作.......
- 一件关于Bug的小事
- 第一周笔记