题中给了 两个同心圆, 一个大圆一个小圆,然后再给了一个大圆一个小圆也是同心圆,求这两个圆环相交的面积,用两个大圆面积减去两倍大小圆面积交加上两个小圆面积交,就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 圆环相交面积的更多相关文章

  1. 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 ...

  2. hdu 5120(求两个圆环相交的面积 2014北京现场赛 I题)

    两个圆环的内外径相同 给出内外径 和 两个圆心 求两个圆环相交的面积 画下图可以知道 就是两个大圆交-2*小圆与大圆交+2小圆交 Sample Input22 30 00 02 30 05 0 Sam ...

  3. hdu3060Area2(任意多边形相交面积)

    链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多 ...

  4. 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 ...

  5. 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 ...

  6. hdu5858 Hard problem(求两圆相交面积)

    题目传送门 Hard problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  7. hdu 3264 Open-air shopping malls(圆相交面积+二分)

    Open-air shopping malls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  8. HDU 3467 (求五个圆相交面积) Song of the Siren

    还没开始写题解我就已经内牛满面了,从晚饭搞到现在,WA得我都快哭了呢 题意: 在DotA中,你现在1V5,但是你的英雄有一个半径为r的眩晕技能,已知敌方五个英雄的坐标,问能否将该技能投放到一个合适的位 ...

  9. HDU 3264 Open-air shopping malls (计算几何-圆相交面积)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3264 题意:给你n个圆,坐标和半径,然后要在这n个圆的圆心画一个大圆,大圆与这n个圆相交的面积必须大于等 ...

随机推荐

  1. Thinkphp 修改U方法按路由规则生成url

    tp开户路由后,使用U方法是不会按路由规则生成url的,一般我们是要手动修改模版,把里面的U方法去掉,手动修改链接,如果是已经写好的程序,后期才添加路由,修改起链接就太麻烦了 今天无聊就修改了一下U方 ...

  2. PyQt4发射信号

    继承自QtCore.QObject的对象均可以发射信号.如果我们单击一个按钮,那么一个clicked()信号就会被触发.下面的示例演示如何手动发射一个信号. #!/usr/bin/python # - ...

  3. CSS3 属性组参考资料

    CSS 属性组: 动画 背景 边框和轮廓 盒(框) 颜色 内容分页媒体 定位 可伸缩框 字体 生成内容 网格 超链接 行框 列表 外边距 Marquee 多列 内边距 分页媒体 定位 打印 Ruby ...

  4. 【go】用Golang的 http 包建立 Web 服务器

    web.go package main import ( "fmt" "log" "net/http" "strings" ...

  5. 【PHP】 php实现字符串反转:支持中英文

    strrev  函数对英文很好用,直接可以实现字符串翻转 但是面对中文呢?肯定都是乱码,对于这样的问题有很多,比如strstr,substr等函数都是这样的. PHP提供了mb_类的函数实现不同编码. ...

  6. MUI Hbuilder设置模拟器运行APP项目

    1 安装hbuilder和夜神模拟器 2 hbuilder  新建app项目 3 hbuilder:运行-> 设置web服务器->Hbuilder 第三方安卓模拟器端口:62001 4 运 ...

  7. 三、微信小游戏开发 --- 小游戏API调用Platform

    微信小游戏API Platform主要是Egret用于来调用平台的SDK的. 在Egret中使用接口定义Platform. Egret项目中默认的platform值是DebugPlatform. 发布 ...

  8. 【BZOJ3037/2068】创世纪/[Poi2004]SZP 树形DP

    [BZOJ3037]创世纪 Description applepi手里有一本书<创世纪>,里面记录了这样一个故事……上帝手中有着N 种被称作“世界元素”的东西,现在他要把它们中的一部分投放 ...

  9. c# winform窗体边框风格的设计

    1.首先,窗体的FormBorderStyle设置成None,不要控制边框. 2.然后,TransparencyKey和BackColor颜色设置成相同的,这样,窗体就透明了. 3.最后,窗体的拖动 ...

  10. OC开发_Storyboard——UIApplication和网络活动指示器

    一.UIApplication 只有一个实例: UIApplication *myApplication = [UIApplication sharedApplication]; 属性如果设置为YES ...