HDU 5130 Signal Interference
来源:互联网 发布:狗粮 饼干 淘宝 编辑:程序博客网 时间:2024/06/05 18:52
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5130
转载链接:http://blog.csdn.net/qq_21057881/article/details/51298432
题意: 就是求一个圆和多边形相交的公共面积.
分析:这是参考别人的模板,拿来己用.
代码:
/* Author:GavinjouElephant * Title: * Number: * main meanning: * * * */#include <iostream>using namespace std;#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>#include <sstream>#include <cctype>#include <vector>#include <set>#include <cstdlib>#include <map>#include <queue>//#include<initializer_list>//#include <windows.h>//#include <fstream>//#include <conio.h>#define MaxN 0x7fffffff#define MinN -0x7fffffff#define lson 2*k#define rson 2*k+1typedef long long ll;const int INF=0x3f3f3f3f;const int maxn=1e5+10;#define eps 1e-8int Scan()//读入整数外挂.{ int res = 0, ch, flag = 0; if((ch = getchar()) == '-') //判断正负 flag = 1; else if(ch >= '0' && ch <= '9') //得到完整的数 res = ch - '0'; while((ch = getchar()) >= '0' && ch <= '9' ) res = res * 10 + ch - '0'; return flag ? -res : res;} void Out(int a) //输出外挂 { if(a>9) Out(a/10); putchar(a%10+'0'); } struct Point{ double x,y; Point(double x=0, double y=0):x(x),y(y) {} void input() { scanf("%lf%lf",&x,&y); }};typedef Point Vector;struct Circle{ Point c; double r; Circle(){} Circle(Point c,double r):c(c),r(r) {} Point point(double a) { return Point(c.x + cos(a)*r, c.y + sin(a)*r); } void input() { scanf("%lf%lf%lf",&c.x,&c.y,&r); }};int dcmp(double x) { if(x < -eps) return -1; if(x > eps) return 1; return 0;}template <class T> T sqr(T x) { return x * x;}Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); }Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p); }Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p); }bool operator < (const Point& a, const Point& b) { return a.x < b.x || (a.x == b.x && a.y < b.y); }bool operator >= (const Point& a, const Point& b) { return a.x >= b.x && a.y >= b.y; }bool operator <= (const Point& a, const Point& b) { return a.x <= b.x && a.y <= b.y; }bool operator == (const Point& a, const Point& b) { return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0; }double Dot(Vector A, Vector B) { return A.x*B.x + A.y*B.y; }double Length(Vector A) { return sqrt(Dot(A, A)); }double Angle(Vector A, Vector B) { return acos(Dot(A, B) / Length(A) / Length(B)); }double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; }Vector VectorUnit(Vector x){ return x / Length(x);}Vector Normal(Vector x) { return Point(-x.y, x.x) / Length(x);}double angle(Vector v) { return atan2(v.y, v.x); }bool OnSegment(Point P, Point A, Point B) { return dcmp(Cross(A-P,B-P)) == 0 && dcmp(Dot(A-P,B-P)) < 0;}double DistanceToSeg(Point P, Point A, Point B){ if(A == B) return Length(P-A); Vector v1 = B-A, v2 = P-A, v3 = P-B; if(dcmp(Dot(v1, v2)) < 0) return Length(v2); if(dcmp(Dot(v1, v3)) > 0) return Length(v3); return fabs(Cross(v1, v2)) / Length(v1);}double DistanceToLine(Point P, Point A, Point B){ Vector v1 = B-A, v2 = P-A; return fabs(Cross(v1,v2)) / Length(v1);}Point DisP(Point A, Point B){ return Length(B-A);}bool SegmentIntersection(Point A,Point B,Point C,Point D) { return max(A.x,B.x) >= min(C.x,D.x) && max(C.x,D.x) >= min(A.x,B.x) && max(A.y,B.y) >= min(C.y,D.y) && max(C.y,D.y) >= min(A.y,B.y) && dcmp(Cross(C-A,B-A)*Cross(D-A,B-A)) <= 0 && dcmp(Cross(A-C,D-C)*Cross(B-C,D-C)) <= 0;}Point Zero = Point(0,0);double TriAngleCircleInsection(Circle C, Point A, Point B){ Vector OA = A-C.c, OB = B-C.c; Vector BA = A-B, BC = C.c-B; Vector AB = B-A, AC = C.c-A; double DOA = Length(OA), DOB = Length(OB),DAB = Length(AB), r = C.r; if(dcmp(Cross(OA,OB)) == 0) return 0; if(dcmp(DOA-C.r) < 0 && dcmp(DOB-C.r) < 0) return Cross(OA,OB)*0.5; else if(DOB < r && DOA >= r) { double x = (Dot(BA,BC) + sqrt(r*r*DAB*DAB-Cross(BA,BC)*Cross(BA,BC)))/DAB; double TS = Cross(OA,OB)*0.5; return asin(TS*(1-x/DAB)*2/r/DOA)*r*r*0.5+TS*x/DAB; } else if(DOB >= r && DOA < r) { double y = (Dot(AB,AC)+sqrt(r*r*DAB*DAB-Cross(AB,AC)*Cross(AB,AC)))/DAB; double TS = Cross(OA,OB)*0.5; return asin(TS*(1-y/DAB)*2/r/DOB)*r*r*0.5+TS*y/DAB; } else if(fabs(Cross(OA,OB)) >= r*DAB || Dot(AB,AC) <= 0 || Dot(BA,BC) <= 0) { if(Dot(OA,OB) < 0) { if(Cross(OA,OB) < 0) return (-acos(-1.0)-asin(Cross(OA,OB)/DOA/DOB))*r*r*0.5; else return ( acos(-1.0)-asin(Cross(OA,OB)/DOA/DOB))*r*r*0.5; } else return asin(Cross(OA,OB)/DOA/DOB)*r*r*0.5; } else { double x = (Dot(BA,BC)+sqrt(r*r*DAB*DAB-Cross(BA,BC)*Cross(BA,BC)))/DAB; double y = (Dot(AB,AC)+sqrt(r*r*DAB*DAB-Cross(AB,AC)*Cross(AB,AC)))/DAB; double TS = Cross(OA,OB)*0.5; return (asin(TS*(1-x/DAB)*2/r/DOA)+asin(TS*(1-y/DAB)*2/r/DOB))*r*r*0.5 + TS*((x+y)/DAB-1); }}//data segmentPoint p[507],A,B;//data endsint main(){#ifndef ONLINE_JUDGE freopen("coco.txt","r",stdin); freopen("lala.txt","w",stdout);#endif int n,i,j,cs = 1; double k; while(scanf("%d%lf",&n,&k)!=EOF) { for(i=1;i<=n;i++) p[i].input(); A.input(), B.input(), p[n+1] = p[1]; double D = (2.0*k*k*A.x-2.0*B.x)/(1.0-k*k); double E = (2.0*k*k*A.y-2.0*B.y)/(1.0-k*k); double F = (B.x*B.x+B.y*B.y-k*k*(A.x*A.x+A.y*A.y))/(1.0-k*k); Circle C = Circle(Point(-D*0.5,-E*0.5),sqrt(D*D+E*E-4.0*F)*0.5); double ans = 0.0; for(i=1;i<=n;i++) ans += TriAngleCircleInsection(C, p[i], p[i+1]); printf("Case %d: %.10f\n",cs++,fabs(ans)); } return 0;}
0 0
- HDU 5130 Signal Interference
- HDU 5130 Signal Interference(计算几何)
- HDOJ 5130 Signal Interference
- HDU 5130 【2014广州现场赛 D】 Signal Interference
- Interference Signal
- Interference Signal
- hdu 5130 Signal Interference(计算几何+圆与多边形交的面积)
- HDU 5130 Signal Interference (2014年广州赛区现场赛D题)
- HDU 5130 Signal Interference(圆与多边形交的面积)
- [HDU 5130] Signal Interference (圆与简单多边形面积交)
- HDU 5130 Signal Interference (求圆与多边形相交面积 模板)
- nyoj1242 Interference Signal
- Interference Signal 第八届
- NYOJ Interference Signal---1242
- NYOJ-Interference Signal
- NYOJ-1242-Interference Signal
- G Interference Signal
- Signal Interference -(hdu5130)
- C++输出格式控制、输入含空格的字符串
- iOS7下滑动返回与ScrollView共存
- 反射模拟框架中配置的加载
- 435. Non-overlapping Intervals
- C++11 多线程同步
- HDU 5130 Signal Interference
- Asm实现静态AOP的两种方式-生成java-proxy类
- Eclipse快捷键
- spark机器学习-聚类
- 内心深处的震撼,科研道路上的拙见,命运不甘平凡的抗争
- <四> 无显示器的情况下远程登录树莓派
- 半成品技术博客开张了
- poj2260
- 应用布尔盲注来爆库(1)