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个圆相交的面积必须大于等 ...
随机推荐
- Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器[摘抄]
[文章作者:张宴 本文版本:v6.3 最后修改:2010.07.26 转载请注明原文链接:http://blog.s135.com/nginx_php_v6/] 前言:本文是我撰写的关于搭建“Ngin ...
- Effective C++ —— 继承与面向对象设计(六)
条款32 : 确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public inheritance(公开继承)意味“is-a”(是一种)的关系.请务必牢记.当 ...
- printf如何输出64位整数
From: http://blog.csdn.net/zzqhost/article/details/6064886 关于printf函数输出64位数的问题,其实在window下和linux下是不一样 ...
- GIT+ Coding使用方法
1 进入码市 :https://coding.net 注册一个账户 2 创建一个项目: 3 本地window环境.安装git : https://git-scm.com/download/win ...
- springdata----->spring集成redis(一)
使用spring-data-redis与redis集成,今天我们就通过例子来学习一下.当时间和耐心都已经变为奢侈,我们只能靠星座了解彼此. spring与redis集成的实例 注意:这里我们测试的是安 ...
- 深入浅出Docker(二):Docker命令行探秘
1. Docker命令行 Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法.但是由于Docker技术的快速发展,此交互式教程已经无法满 ...
- RabbitMQ的安装和使用Python连接RabbitMQ
绪论 这里的环境使用的是Mac OS X系统,所有的配置和使用都是基于Mac OS X 和Python 2.7 以及对应的pika库的. RabbitMQ的安装和配置 安装部分 #brew insta ...
- @font-face 字体
一.@font-face是CSS3中的一个模块,把自己定义的Web字体嵌入到你网页中 @font-face的语法规则 @font-face { font-family: <YourWebFont ...
- Asp SqlDataSource将数据库数据绑定在 GridView
1.首先认识一下GridView的几条属性 ☻AllowPaging 确定是否可以分页 ☻AllowSorting 确定是否可以进行排序 ☻AlternatingRowStyle 指定奇数行样式 ...
- C++ 引用的辨别
对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中它却有着不同的用途,掌握C++的&符号,是提高代码执行效率 ...