题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120

解题报告:给你两个完全相同的圆环,要你求这两个圆环相交的部分面积是多少?

题意看了好久没懂。圆环由一个大圆里面套一个小圆,中间部分就是圆环,两圆环相交面积 = 大圆相交的面积 - 2*大圆与小圆相交的面积 + 小圆与小圆相交的面积。

也就是说,这题就可以化为求两个圆的相交的面积了。可以利用两个圆的方程,求出圆的交点所在的直线,然后求出圆心到这条直线的距离,就可以求出两个圆对应的扇形的圆心角是多少了。要注意的地方就是,注意两个圆的位置关系,可能是相交,包含,或者相离,其中相交的情况下,还要注意较小的那个圆的扇形的圆心角是不是钝角,可以通过判断两个圆心的位置是 不是在圆的交点所在直线的同一侧,判断这个可以将两个圆心代入直线方程,乘积小于0,说明这两个点在这条直线的两侧。然后,如果是圆心在交点所在直线的同一侧,那么,求这部分相交的面积的时候,应该用小圆扇形的面积加上那个三角形的面积,否则就是扇形面积减去那个三角形的面积。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const double PI = acos(-1.0),eps = 1e-;
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 ;
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) <= ) //两圆心在园交点的两侧
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 = ;
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 ;
}

HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)的更多相关文章

  1. HDU 5120 A Curious Matt(2014北京赛区现场赛A题 简单模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5112 解题报告:扫一遍 #include<cstdio> #include<cstr ...

  2. HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128 解题报告:在一个平面上给出n个点的坐标,用这n个点作为矩形的四个顶点,作两个矩形,要求两个矩形不 ...

  3. HDU 5073 Galaxy(2014鞍山赛区现场赛D题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 解题报告:在一条直线上有n颗星星,一开始这n颗星星绕着重心转,现在我们可以把其中的任意k颗星星移 ...

  4. HDU 5071 Chat(2014鞍山赛区现场赛B题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 解题报告:一个管理聊天窗口的程序,一共有八种操作,然后要注意的就是Top操作只是把编号为u的窗口 ...

  5. HDU 5074 Hatsune Miku(2014鞍山赛区现场赛E题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 解题报告:给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽 ...

  6. [hdu5113]Black And White2014北京赛区现场赛B题(搜索加剪枝)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Black And White Time Limit: 2000/2000 MS ...

  7. ACM总结——2017ACM-ICPC北京赛区现场赛总结

    现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情 ...

  8. HDU 4816 Bathysphere (2013长春现场赛D题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 2013长春区域赛的D题. 很简单的几何题,就是给了一条折线. 然后一个矩形窗去截取一部分,求最 ...

  9. 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...

随机推荐

  1. Git连接到自己的GitHub仓库

    1.配置本地git $git config --global user.name "xxx" $git config --global user.email "xxxxx ...

  2. 利用WSCF进行契约先行的Web Services开发

    http://www.cnblogs.com/goody9807/archive/2007/06/05/772107.html 什么是契约先行(Contract-First)? 如果说一个新的软件开发 ...

  3. edmx代码分析

    http://www.cnblogs.com/FoundationSoft/archive/2011/01/08/1930479.html 本文分析Entity Framework从数据库自动生成的模 ...

  4. 【原】js获取height为auto的高度问题

    今天用react写一个页面,需要获取一个img高度设置为auto的高度,可是一直获取到的要么是0,要么是null,因为页面加载完了图片不一定加载完. 当我把高度由 auto 设置为固定值之后,又可以获 ...

  5. asp.net ListBox 移除操作的思路

    ArrayList arrRight = new ArrayList(); protected void ImageButton1_Click(object sender, ImageClickEve ...

  6. js 对象属性复制到另一个对象

    var obj={a:1,b:2,c:3} var newObj={};for(var i in obj){newObj[i]=obj[i];}console.log(newObj);

  7. ecshop 活动-》红包

    按商品发放:可以给指定某个商品发红包(购买付款,卖家发货后,会自动给买家发送红包:不是买家在付款的时候就自动可以减少红包金额) 按订单金额发放:订单满xx后(卖家发货后,会自动给买家发放红包)

  8. 快速的mysql导入导出数据(load data和outfile)

    1.load data: ***实际应用:把日志生成的xls文件load到MySQL中: mysql_cmd = "iconv -c -f utf-8 -t gbk ./data/al_ve ...

  9. IIS Express 虚拟目录

    1.打开C:\Users\<用户名>\Documents\IISExpress\config\applicationhost.config 2.编辑site节如下(行4) [html] v ...

  10. osharp3引入事务后操作结果类别的调整

    /// <summary> /// 表示业务操作结果的枚举, /// 对于业务务操作单元的影响只有二种状态, /// 成功,无变化: 操作将继续,事务将继续 /// 失败:将导致 操作被中 ...