HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)
题目链接: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题 计算几何)的更多相关文章
- HDU 5120 A Curious Matt(2014北京赛区现场赛A题 简单模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5112 解题报告:扫一遍 #include<cstdio> #include<cstr ...
- HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128 解题报告:在一个平面上给出n个点的坐标,用这n个点作为矩形的四个顶点,作两个矩形,要求两个矩形不 ...
- HDU 5073 Galaxy(2014鞍山赛区现场赛D题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 解题报告:在一条直线上有n颗星星,一开始这n颗星星绕着重心转,现在我们可以把其中的任意k颗星星移 ...
- HDU 5071 Chat(2014鞍山赛区现场赛B题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 解题报告:一个管理聊天窗口的程序,一共有八种操作,然后要注意的就是Top操作只是把编号为u的窗口 ...
- HDU 5074 Hatsune Miku(2014鞍山赛区现场赛E题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 解题报告:给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽 ...
- [hdu5113]Black And White2014北京赛区现场赛B题(搜索加剪枝)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Black And White Time Limit: 2000/2000 MS ...
- ACM总结——2017ACM-ICPC北京赛区现场赛总结
现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情 ...
- HDU 4816 Bathysphere (2013长春现场赛D题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 2013长春区域赛的D题. 很简单的几何题,就是给了一条折线. 然后一个矩形窗去截取一部分,求最 ...
- 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...
随机推荐
- redshift编译遇到的错误(ubuntu14.04)
1. ./bootstrap: 6: ./bootstrap: autopoint: not found 解决方法: $ sudo apt-get install autopoint 2. autor ...
- JavaWeb---总结(十八)JSP属性范围
所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...
- Objective-C学习笔记类目、协议
不是所有的方法都可以被覆盖的!比如:intValue就不能被覆盖!! 原因正在查找中! 别人的电脑上却可以! 类目.h件 #import <Foundation/Foundation.h> ...
- swfUpload 上传图片
前端: <script src="~/Scripts/swfupload/swfupload.js"></script> <script src=&q ...
- C#------各种常见错误解决方法
1.错误:模型生成过程中检测到一个或多个验证错误 表示实体中的数据列没有和SQLServer数据库里面的表中的数据列完全相同,比如SQLServer中有ID,Name,Post,那么实体中也应该有ID ...
- Android学习笔记——menu
该工程的功能是实现两个数相乘,并在另外一个Activity中显示计算的结果 以下的代码是MainActivity.java中的代码 package com.example.menu; import a ...
- Linux 普通进程 后台进程 守护进程
一.普通进程与后台进程 默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作.对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'& ...
- php----显示中文乱码的问题
条件: 在显示页面设置页面编码格式为<?php header('Content-Type: text/html; charset=utf-8');?>: 在写入数据库时设置:mysql_q ...
- OpenGL Code Resources
https://www.opengl.org/wiki/Code_Resources http://ogldev.atspace.co.uk/
- Unity Editor开发
SerializedObject SerializedObject.Update()更新所有序列化对象的值:SerializedObject.ApplyModifiedProperties()应用序列 ...