HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)
2014-11-30 01:35
387 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120
解题报告:给你两个完全相同的圆环,要你求这两个圆环相交的部分面积是多少?
题意看了好久没懂。圆环由一个大圆里面套一个小圆,中间部分就是圆环,两圆环相交面积 = 大圆相交的面积 - 2*大圆与小圆相交的面积 + 小圆与小圆相交的面积。
也就是说,这题就可以化为求两个圆的相交的面积了。可以利用两个圆的方程,求出圆的交点所在的直线,然后求出圆心到这条直线的距离,就可以求出两个圆对应的扇形的圆心角是多少了。要注意的地方就是,注意两个圆的位置关系,可能是相交,包含,或者相离,其中相交的情况下,还要注意较小的那个圆的扇形的圆心角是不是钝角,可以通过判断两个圆心的位置是 不是在圆的交点所在直线的同一侧,判断这个可以将两个圆心代入直线方程,乘积小于0,说明这两个点在这条直线的两侧。然后,如果是圆心在交点所在直线的同一侧,那么,求这部分相交的面积的时候,应该用小圆扇形的面积加上那个三角形的面积,否则就是扇形面积减去那个三角形的面积。
View Code
解题报告:给你两个完全相同的圆环,要你求这两个圆环相交的部分面积是多少?
题意看了好久没懂。圆环由一个大圆里面套一个小圆,中间部分就是圆环,两圆环相交面积 = 大圆相交的面积 - 2*大圆与小圆相交的面积 + 小圆与小圆相交的面积。
也就是说,这题就可以化为求两个圆的相交的面积了。可以利用两个圆的方程,求出圆的交点所在的直线,然后求出圆心到这条直线的距离,就可以求出两个圆对应的扇形的圆心角是多少了。要注意的地方就是,注意两个圆的位置关系,可能是相交,包含,或者相离,其中相交的情况下,还要注意较小的那个圆的扇形的圆心角是不是钝角,可以通过判断两个圆心的位置是 不是在圆的交点所在直线的同一侧,判断这个可以将两个圆心代入直线方程,乘积小于0,说明这两个点在这条直线的两侧。然后,如果是圆心在交点所在直线的同一侧,那么,求这部分相交的面积的时候,应该用小圆扇形的面积加上那个三角形的面积,否则就是扇形面积减去那个三角形的面积。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; const double PI = acos(-1.0),eps = 1e-9; struct point { double x,y; }; struct circle { point c; double r; }; circle A,a,B,b; double dis(point a,point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double dis_line(point p,double a,double b,double c) { return(fabs(a*p.x+b*p.y+c)/sqrt(a*a+b*b)); } double get_in(circle x,circle y) //求两 园交集的面积 { if(dis(x.c,y.c) < (x.r-y.r) || fabs(dis(x.c,y.c) - (x.r-y.r)) < eps) return PI * y.r*y.r; if(dis(x.c,y.c) > x.r+y.r || fabs(dis(x.c,y.c)-(x.r+y.r)) < eps) return 0; double a = 2.0 * (x.c.x - y.c.x),b = 2.0 * (x.c.y-y.c.y),c = y.c.x*y.c.x-x.c.x*x.c.x + y.c.y*y.c.y-x.c.y*x.c.y+x.r*x.r-y.r*y.r; double l1 = dis_line(x.c,a,b,c); double co1 = acos(l1 / x.r) * 2.0; double s1 = PI * x.r*x.r*(co1/PI/2.0) - (0.5*x.r*x.r*sin(co1)); double l2 = dis_line(y.c,a,b,c); double co2 = acos(l2 / y.r) * 2.0,s2; if((a*x.c.x+b*x.c.y+c) * (a*y.c.x+b*y.c.y+c) <= 0) //两圆心在园交点的两侧 s2 = PI * y.r*y.r*(co2 / PI/2.0) - (0.5*y.r*y.r*sin(co2)); else s2 = PI * y.r*y.r*((2.0*PI-co2)/(2.0*PI)) + (0.5*y.r*y.r*sin(co2)); return s1+s2; } int main() { // freopen("in","r",stdin); int T,kase = 1; scanf("%d",&T); while(T--) { double r1,r2; scanf("%lf%lf",&r1,&r2); scanf("%lf%lf",&A.c.x,&A.c.y); a = A; scanf("%lf%lf",&B.c.x,&B.c.y); b = B; A.r = B.r = r2; a.r = b.r = r1; double ans = get_in(A,B); // printf("%lf\n",get_in(A,B)); ans -= (2.0 * get_in(A,b)); // printf("%lf\n",get_in(A,b)); ans += get_in(a,b); // printf("%lf\n",get_in(a,b)); printf("Case #%d: %lf\n",kase++,ans+eps); } return 0; }
View Code
相关文章推荐
- HDU 5120 Intersection (计算几何)2014ICPC 北京站现场赛
- HDU 5120 A Curious Matt(2014北京赛区现场赛A题 简单模拟)
- HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)
- 2014北京赛区现场赛B hdu 5113 Black And White
- HDU 5115 Dire Wolf(2014ACM/ICPC北京赛区现场赛D)
- HDU-5122-K.Bro Sorting (2014ACM/ICPC北京赛区现场赛K题!)
- HDU 5120 Intersection(计算几何)
- HDU 5120 Intersection(2014亚洲区北京站现场赛)
- HDU - 5120 Intersection(简单几何)——2014ACM/ICPC亚洲区北京站
- hdu-5120 Intersection(计算几何)
- hdu 5120(求两个圆环相交的面积 2014北京现场赛 I题)
- HDU 5117 Fluorescent(2014 ACM/ICPC 北京赛区现场赛)
- HDU 5120 Intersection (计算几何)
- HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
- 2014北京赛区现场赛解题报告
- hdu 3685 10 杭州 现场 F - Rotational Painting 重心 计算几何 难度:1
- HDU 5115 Dire Wolf (2014ACM亚洲区域赛北京赛区重现)D
- HDU-5112-A Curious Matt (2014ACM/ICPC北京赛区现场赛A题!)
- HDU 5122 K.Bro Sorting(2014北京区域赛现场赛K题 模拟)
- Intersection (2014北京现场赛 ACM-ICPC)