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个圆相交的面积必须大于等 ...
随机推荐
- 关于直播学习笔记-002-Red5 & Sewise Player & Wirecast
一.工具软件 [1]. 视频采集端 Red5 Demo:http://192.168.31.107:5080/demos/simpleBroadcaster.html Telestream:Wirec ...
- Nginx(二)-- 配置文件之虚拟主机配置
1.配置文件与解释 #user nobody; worker_processes 1; # 设置工作子进程,默认是1个工作子进程,可以修改,一般设置为CPU的总核数 #error_log logs/e ...
- CentOS6.5安装图形界面(Gnome)
因为是以最小化安装的Linux,无法使用图形界面,从网上看到资料,我使用yum安装果然很简单 ----------------------------------------------------- ...
- 百度地图出现UnsatisfiedLinkError: Native method not found: com.baidu...
这是由于导入os文件方式引起 解决办法有两种: 第一种: 弄一个文件夹so/armeabi,把所有的so全部放进去.结构就是so/armeabi/a.so,b.so,c.so 然后压缩这个文件夹成为s ...
- 说说M451例程讲解之LED
/**************************************************************************//** * @file main.c * @ve ...
- C#中的抽象类与重写
今天的我们学习了好多,最初上午学习了文件流的方法,老师告诉我们是选修,可能以后不怎么用吧,但是还是想学下,似乎用个小程序读写文件很快地节奏,所以有点小兴趣学习,明天我再看看啦!今天之后学习了多态,继承 ...
- vsftpd配置教程
原文:http://www.cnblogs.com/hhuai/archive/2011/02/12/1952647.html 可能会遇到的问题: http://www.cnblogs.com/wea ...
- C++11新特性之九——function、bind以及lamda表达式总结
本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制.之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对 ...
- iOS性能调优系列(全)
总结: 三类工具 基础工具 (NSLog的方式记录运行时间.) 性能工具.检测各个部分的性能表现,找出性能瓶颈 内存工具.检查内存正确性和内存使用效率 性能工具: 可以衡量CPU的使用,时间的消耗,电 ...
- AndroidのUI布局之layout weight
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...