西南民大oj(两园交求面积)
西南民大oj:http://www.swunacm.com/acmhome/welcome.do?method=index
我的几何不可能那么可爱
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 11 测试通过 : 8
总提交 : 11 测试通过 : 8
描述
小朋友们 你们好~ 你们都知道AT立场吧
AT立场又叫“A T Field”,是“Absolute Terror Field”的缩写。直译作“绝对恐怖领域”,又称绝对领域。视觉化的AT力场呈金色套合多边形状,拥有AT力场的使徒几乎能抵挡所有常规武器的攻击,只有另一个AT力场才可能将其中和(EVA机体即可展开同样的力场)。AT力场的含义被深化为“将自身与自我(ego)
和客观世界分割开的一堵墙”,揭示出了“每个生物都有AT力场”的道理。渚薰称人类的AT 力场为“心之壁”。
现在 真嗣与渚薰同时放出了AT立场。
我们现在要算的就是两个人AT立场在二维坐标平面的相交面积。
为了使题目简单,我们假设 两人处于同一个二维坐标平面,两人所放的at立场呈完美的圆形,给出两人的坐标,与两人AT立场的释放半径,求相交的面积。
输入
多组输入输出
第一行 真嗣所在的坐标x与坐标y以及AT立场释放半径r
第二行 渚薰所在的坐标x与坐标y以及AT立场释放半径r
(|x|,|y|,|r|<=100,且x,y,r全是整数额)
输出
两人AT立场相交的面积 保留3位小数
样例输入
0 0 1
0 1 1
样例输出
1.228
提示
几何什么的真是太简单了!
题意:给定两园坐标与半径求相交面积。
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 1000000007 #define inf 0x3f3f3f3f #define N 1000010 using namespace std; #define sqr(x) ((x)*(x)) const double eps=1e-9; const double inf=1e10; const double pi=acos(-1.0); const int maxn=22; struct point { double x, y; }; struct circle { point o; double r; } c[maxn]; int n; double dis(point a, point b) { return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)); } int sgn(double x) { if(fabs(x)<eps)return 0; if(x>0)return 1; return -1; } double circle_inter_area(circle c1, circle c2) { double d=dis(c1.o, c2.o); if(c1.r<c2.r)swap(c1, c2); if(sgn(d-c1.r-c2.r)>=0) return 0;//相离或外切 if(sgn(d-(c1.r-c2.r))<=0)return pi*sqr(c2.r);//内含或内切 double ang1, ang2; ang1=acos((sqr(c1.r)+sqr(d)-sqr(c2.r))/(2.0*c1.r*d)); ang2=acos((sqr(c2.r)+sqr(d)-sqr(c1.r))/(2.0*c2.r*d)); double res=ang1*sqr(c1.r)+ang2*sqr(c2.r)-d*c1.r*sin(ang1); return res; } int main() { while(scanf("%lf%lf%lf%lf%lf%lf",&c[0].o.x, &c[0].o.y, &c[0].r,&c[1].o.x, &c[1].o.y, &c[1].r)>0) printf("%.3lf\n", circle_inter_area(c[0],c[1])); return 0; }