hdu5012 圆环相交面积
题中给了 两个同心圆, 一个大圆一个小圆,然后再给了一个大圆一个小圆也是同心圆,求这两个圆环相交的面积,用两个大圆面积减去两倍大小圆面积交加上两个小圆面积交,就ok了
这里算是坑明白了 使用acos的时候要保证不能让大于1或者小于-1的数进来,因此加一个判断,在现场的时候就是这里被坑死了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
const double epl =0.0000000001;
const double PI=acos(-1.0);
struct point{
double x,y;
point(double a=, double c=){
x=a; y=c;
}
};
struct Circle{
point c;
double r;
point P(double a){
return point( (c.x+cos(a)*r) ,( c.y+sin(a)*r ) );
}
}P1,P2,C1,C2;
int dcmp(double x){
if(fabs(x)<epl) return ;
return x<?-:;
}
double myz(double a){
if(dcmp(a+1.0)<=) return acos(-1.0);
if(dcmp(a-1.0)>=) return acos(1.0);
return acos(a);
} point operator -(point A, point B){
return point(A.x-B.x,A.y-B.y);
}
bool operator ==(point A, point B){
return dcmp(A.x-B.x)==&&dcmp(A.y-B.y)==;
}
double Dot(point A, point B){
return A.x*B.x+A.y*B.y;
}
double length(point A){
return sqrt(Dot(A,A));
}
double Angle(point A, point B){
return myz(Dot(A,B)/length(A)/length(B));
}
double angle(point v){
return atan2(v.y,v.x);
}
int getdd(Circle C1, Circle C2, point &p1, point &p2){
double d=length(C1.c-C2.c);
if(dcmp(d)==){
return ;
}
if(dcmp(C1.r+C2.r-d)<=) return ;
if(dcmp(fabs(C1.r-C2.r)-d)>=) return ;
double a=angle(C2.c-C1.c);
double da=acos((C1.r*C1.r+d*d-C2.r*C2.r)/(*C1.r*d) );
p1= C1.P(a-da),p2=C1.P(a+da);
if(p1==p2)return ;
return ;
}
double Cross(point A, point B){
return A.x*B.y-A.y*B.x;
}
double Area(point A, point B, point C){
return fabs(Cross(B-A,C-A))/;
}
double solve(Circle A, Circle B){
point pp1, pp2;
int a=getdd(A,B,pp1,pp2);
if(a==) return ;
if(a==) {
double r=min(A.r,B.r);
return r*r*PI;
}
if(dcmp(A.r-B.r)==){
double a=Angle(pp1-A.c,pp2-A.c);
double S=A.r*A.r*PI;
double rate=a/(*PI);
double ans=S*rate-Area(A.c,pp1,pp2);
return ans*2.0;
}else{
if(A.r<B.r){
Circle te =A;
A=B;
B=te;
}
if(dcmp(Cross(pp1-pp2,A.c-pp2) )*dcmp(Cross(pp1-pp2,B.c-pp2))>= ){
double a1= Angle(pp1-A.c,pp2-A.c);
double S1=A.r*A.r*PI;
double rate1=a1/(*PI);
double ans1=S1*rate1-Area(A.c,pp1,pp2);
double a2 = Angle(pp1-B.c,pp2-B.c);
double S2 = B.r*B.r*PI;
double rate2 = a2/(*PI);
double ans2=S2*rate2-Area(B.c,pp1,pp2);
return S2-ans2+ans1;
}else{
double a1= Angle(pp1-A.c,pp2-A.c);
double S1=A.r*A.r*PI;
double rate1=a1/(*PI);
double ans1=S1*rate1-Area(A.c,pp1,pp2);
double a2 = Angle(pp1-B.c,pp2-B.c);
double S2 = B.r*B.r*PI;
double rate2 = a2/(*PI);
double ans2=S2*rate2-Area(B.c,pp1,pp2);
return ans1+ans2;
}
}
}
int main()
{
int T;
scanf("%d",&T);
int cas=;
double x1,x2,y1,y2,r,R;
while(T--){
scanf("%lf%lf",&r,&R);
scanf("%lf%lf",&x1,&y1);
scanf("%lf%lf",&x2,&y2);
P1.c=point(x1,y1);
P2.c=point(x1,y1);
C1.c=point(x2,y2);
C2.c=point(x2,y2);
P1.r=C1.r=R;
P2.r=C2.r=r;
double dada=solve(P1,C1);
double daxi=solve(P1,C2)*;
double xixi=solve(C2,P2);
double ans=dada-daxi+xixi;
printf("Case #%d: %.6lf\n",cas++,ans);
}
return ;
}
hdu5012 圆环相交面积的更多相关文章
- I - Intersection HDU - 5120(圆环相交面积)
Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...
- hdu 5120(求两个圆环相交的面积 2014北京现场赛 I题)
两个圆环的内外径相同 给出内外径 和 两个圆心 求两个圆环相交的面积 画下图可以知道 就是两个大圆交-2*小圆与大圆交+2小圆交 Sample Input22 30 00 02 30 05 0 Sam ...
- hdu3060Area2(任意多边形相交面积)
链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...
- Gym 100952J&&2015 HIAST Collegiate Programming Contest J. Polygons Intersection【计算几何求解两个凸多边形的相交面积板子题】
J. Polygons Intersection time limit per test:2 seconds memory limit per test:64 megabytes input:stan ...
- hdu 3264 09 宁波 现场 E - Open-air shopping malls 计算几何 二分 圆相交面积 难度:1
Description The city of M is a famous shopping city and its open-air shopping malls are extremely at ...
- hdu5858 Hard problem(求两圆相交面积)
题目传送门 Hard problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- hdu 3264 Open-air shopping malls(圆相交面积+二分)
Open-air shopping malls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU 3467 (求五个圆相交面积) Song of the Siren
还没开始写题解我就已经内牛满面了,从晚饭搞到现在,WA得我都快哭了呢 题意: 在DotA中,你现在1V5,但是你的英雄有一个半径为r的眩晕技能,已知敌方五个英雄的坐标,问能否将该技能投放到一个合适的位 ...
- HDU 3264 Open-air shopping malls (计算几何-圆相交面积)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3264 题意:给你n个圆,坐标和半径,然后要在这n个圆的圆心画一个大圆,大圆与这n个圆相交的面积必须大于等 ...
随机推荐
- MinGW和MSYS的自动安装 【转】
好吧,这是今天写的第二篇文章.我表示这篇才是今天的重头.(伪 半年之前曾经写过一篇关于MinGW和MSYS的手动安装的文章[1],到现在还是全站点击率最高的.(目前这篇文章是最高的.)好吧,侧面反映了 ...
- IIS7以上版本去掉伪静态去掉index.php方法
1,由于从iis7以上的版本httpd.ini文件已不会被解析,将以下的xml文件复制到web.config 的文件中,然后放到网站的根目录即可. <?xml version="1.0 ...
- vs删除空行 —— 正则表达式以及其他
\r:return 到当前行的最左边. \n: newline 向下移动一行,并不移动左右. 1. ^\s*\n 查找空行 2. ^\s*(?=\r?$)\n 查找空行即 ...
- HTML - 分页效果布局
<p class="jcFY"> 显示 <select name="" id=""> <option valu ...
- Flash 用FLASH遮罩效果做图片切换效果
本教程是关于FLASH应用遮罩效果制作好看的图片切换效果.该教程选用FLASH遮罩中最简单的一种作为例子,当然你可以用自己的想象力来做出更多更好的图片动画.希望本教程能带你带来帮助. 让我们先看看效果 ...
- 【node】---socket---网络通信---【巷子】
1.什么是一个socket? 网络上两个程序通过一个双向的通信连接实现数据交换,这个连接的一端称为socket 2.http与socket的区别 在以前我们实现数据交换已经有了HTTP协议,为什么还要 ...
- yii2.0 如何按需加载并管理CSS样式及JS脚本
链接:http://www.yiichina.com/tutorial/399 (注:以下为Yii2.0高级应用测试) Yii2.0对于CSS/JS 管理,使用AssetBundle资源包类. 视图如 ...
- 3.html+.ashx(删除学生信息)
C03ListStu.ashx 0:false(删除);1:true(正常). (数据库里定义个BOOL型,TRUE表示正常FALSE表示删除) <html> <head> & ...
- SaltStack配置管理-jinja模板
上一篇:SaltStack配置管理-状态间关系 需求:需要apache配置文件里面监听的端口是每个minion本地的地址 saltstack默认的模板是jinjia模板 参考文档:http://doc ...
- python中super的使用
转自:http://python.jobbole.com/86787/ super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能, ...