HDU5130 Signal Interference
/*
HDU5130 Signal Interference
http://acm.hdu.edu.cn/showproblem.php?pid=5130
计算几何 圆与多边形面积交
*
*/ #include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const double Pi=acos(-1.0);
const double eps = 1e-;
const int Nmax=;
double k;
int sgn(double x)
{
if(x<-eps)
return -;
if(x>eps)
return ;
return ;
}
double Abs(double x)
{
if(sgn(x)<)
x=-x;
else if(sgn(x)==)
x=0.0;
return x;
}
double sqr(double x)
{
return x*x;
}
double Sqrt(double x)
{
return max(0.0,sqrt(x));
}
struct Pt
{
double x,y;
Pt() { }
Pt(double x, double y) : x(x), y(y) { } Pt operator - (const Pt &b)
{
return Pt(x-b.x,y-b.y);
}
Pt operator + (const Pt &b)
{
return Pt(x+b.x,y+b.y);
}
friend Pt operator * (double a,Pt p)
{
return Pt(p.x*a,p.y*a);
}
friend Pt operator * (Pt p,double a)
{
return Pt(p.x*a,p.y*a);
}
friend Pt operator / (Pt p,double a)
{
return Pt(p.x/a,p.y/a);
}
double norm()
{
return Sqrt(x*x + y*y);
}
double len()
{
return norm();
}
void print()
{
printf("(%f, %f)\n", x, y);
}
};
int n;
Pt pl[Nmax];
Pt pr,A,B,p0,p1;
double dist (Pt a, Pt b)
{
return (a-b).norm();
}
double dot(Pt a,Pt b)//点乘
{
return a.x*b.x+a.y*b.y;
}
double det(Pt a,Pt b)
{
return a.x*b.y-a.y*b.x;
}
Pt rotate(Pt p,double a)//P点绕原点逆时针旋转a弧度
{
return Pt(p.x*cos(a)-p.y*sin(a),p.x*sin(a)+p.y*cos(a));
}
struct Sg//线段
{
Pt s, t;
Sg() { }
Sg(Pt s, Pt t) : s(s), t(t) { }
Sg(double a, double b, double c, double d) : s(a, b), t(c, d) { }
};
bool PtOnSegment(Pt p, Pt a, Pt b) //p是否在线段ab上,把<=改成<就能实现不含线段端点的点在线段上的判断。
{
return !sgn(det(p-a, b-a)) && sgn(dot(p-a, p-b)) <= ;
}
bool PtOnLine(Pt p, Pt a, Pt b) //p是否在直线ab上
{
return !sgn(det(p-a, b-a));
}
Pt PtLineProj(Pt s, Pt t, Pt p) //p到直线st的投影
{
double r = dot(p-s, t-s) / (t - s).norm();
return s + (t - s) * r;
}
bool parallel(Pt a, Pt b, Pt s, Pt t)
{
return !sgn(det(a-b, s-t));
}
Pt triangleMassCenter(Pt a, Pt b, Pt c)
{
return (a+b+c) / 3.0;
}
double polygon_area(Pt poly[],int n)
{
double ans=0.0;
if(n<)
return ans;
for(int i=;i<=n;i++)
ans+=det(poly[i],poly[i%n+]);
return ans*0.5;
} struct Circle
{
Pt c;
double r;
Circle(Pt _c,double _r)
{
c=_c;
r=_r;
}
};
bool PointInCircle(Circle a,Pt p)
{
Pt c=a.c;
return sgn( (p-c).norm()-a.r )<;
} bool PointOnCircle(Circle a,Pt p)
{
Pt c=a.c;
return sgn( (p-c).norm()-a.r )==;
} bool PointIOCircle(Circle a,Pt p)
{
Pt c=a.c;
return sgn( (p-c).norm()-a.r )<=;
} void circle_cross_line(Circle c,Pt a, Pt b, Pt ans[], int &num)
{
double x1=a.x,y1=a.y,x2=b.x,y2=b.y;
double dx=x2-x1,dy=y2-y1;
double tmpx=x1-c.c.x,tmpy=y1-c.c.y;
double A=dx*dx+dy*dy;
double B=2.0*( dx*tmpx+dy*tmpy );
double C=tmpx*tmpx+tmpy*tmpy-c.r*c.r;
double delta=B*B-4.0*A*C;
num=;
if(sgn(delta)<)
return;
double t1=(-B-Sqrt(delta))/(2.0*A);
double t2=(-B+Sqrt(delta))/(2.0*A);
if(sgn(t1-1.0)<= && sgn(t1)>=)
ans[++num]=Pt(x1+t1*dx,y1+t1*dy);
if(sgn(delta)==)
return;
if(sgn(t2-1.0)<= && sgn(t2)>=)
ans[++num]=Pt(x1+t2*dx,y1+t2*dy);
} double sector_area(Circle c,Pt a,Pt b)
{
a=a-c.c,b=b-c.c;
double theta = atan2(a.y, a.x) - atan2(b.y, b.x);
while (sgn(theta) <= ) theta += 2.0*Pi;
while (sgn(theta-2.0*Pi)>) theta -= 2.0*Pi;
theta = min(theta, 2.0*Pi - theta);
return c.r*c.r*theta*0.5;
} double CirclePolyArea(Circle c,Pt poly[],int n)
{
double ans=0.0;
Pt p[];
int num;
for(int i=;i<=n;i++)
{
Pt a=poly[i],b=poly[i%n+];
int ina=PointInCircle(c,a);
int inb=PointInCircle(c,b);
Pt da=a-c.c,db=b-c.c;
int s=sgn(det(da,db));
double part=0.0;
if(ina)
{
if(inb)
{
part=Abs(det(da,db))*0.5;
}
else
{
circle_cross_line(c,a,b,p,num);
part=sector_area(c,p[],b)+Abs(det(da,p[]-c.c))*0.5;
}
}
else
{
if(inb)
{
circle_cross_line(c,a,b,p,num);
part=sector_area(c,p[],a)+Abs(det(db,p[]-c.c))*0.5;
}
else
{
circle_cross_line(c,a,b,p,num);
if(num==)
{
part=sector_area(c,a,p[])+sector_area(c,b,p[])+Abs(det(p[]-c.c,p[]-c.c))*0.5;
}
else
{
part=sector_area(c,a,b);
}
}
}
if(s!=)
ans+=1.0*s*part;
}
return ans;
}
int main()
{
int t=;
while(scanf("%d%lf",&n,&k)==)
{
t++;
for(int i=;i<=n;i++)
scanf("%lf%lf",&pl[i].x,&pl[i].y);
scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y);
double r;
double E=(2.0*B.x-2.0*sqr(k)*A.x)/(1.0-sqr(k));
double F=(2.0*B.y-2.0*sqr(k)*A.y)/(1.0-sqr(k));
double G=(sqr(k*A.x)+sqr(k*A.y)-sqr(B.x)-sqr(B.y))/(1.0-sqr(k));
pr.x=E/2.0,pr.y=F/2.0;
r=Sqrt(G+sqr(E)/4.0+sqr(F)/4.0);
Circle C(pr,r);
double ans=Abs( CirclePolyArea(C,pl,n) );
printf("Case %d: ",t);
printf("%.10f\n",ans+eps);
}
return ;
}
HDU5130 Signal Interference的更多相关文章
- HDU 5130 Signal Interference(计算几何 + 模板)
HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...
- HDU 5130 Signal Interference --计算几何,多边形与圆的交面积
题意: 求所有满足PB <= k*PA 的P所在区域与多边形的交面积. 解法: 2014广州赛区的银牌题,当时竟然没发现是圆,然后就没做出来,然后就gg了. 圆的一般式方程: 设A(x1,y1) ...
- 简单几何(圆与多边形公共面积) UVALive 7072 Signal Interference (14广州D)
题目传送门 题意:一个多边形,A点和B点,满足PB <= k * PA的P的范围与多边形的公共面积. 分析:这是个阿波罗尼斯圆.既然是圆,那么设圆的一般方程:(x + D/2) ^ 2 + (y ...
- HDU - 5130 :Signal Interference (多边形与圆的交)
pro:A的监视区域是一个多边形. 如果A的监视区的内满足到A的距离到不超过到B的距离的K倍的面积大小.K<1 sol:高中几何体经验告诉我们满足题意的区域是个圆,那么就是求圆与多边形的交. # ...
- LA 7072 Signal Interference 计算几何 圆与多边形的交
题意: 给出一个\(n\)个点的简单多边形,和两个点\(A, B\)还有一个常数\(k(0.2 \leq k < 0.8)\). 点\(P\)满足\(\left | PB \right | \l ...
- FBOSS: Building Switch Software at Scale
BOSS: 大规模环境下交换机软件构建 本文为SIGCOMM 2018 论文,由Facebook提供. 本文翻译了论文的关键内容. 摘要: 在网络设备(例如交换机和路由器)上运行的传统软件,通常是由供 ...
- PatentTips - Solid State Disk (SSD) Device
BACKGROUND OF THE INVENTION A SSD apparatus is a large-capacity data storage device using a nonvolat ...
- 第八届河南省赛G.Interference Signal(dp)
G.Interference Signal Time Limit: 2 Sec Memory Limit: 128 MB Submit: 35 Solved: 17 [Submit][Status ...
- G.Interference Signal---河南省第八届程序设计大赛(dp)
G.Interference Signal 时间限制: 2 Sec 内存限制: 128 MB提交: 47 解决: 18[提交][状态] 题目描述 Dr.Kong’s laboratory moni ...
随机推荐
- Linux用户和组的管理
一.概述: 1.Linux下的三类用户: (1).超级用户(root)具有操作系统的一切权限UID值均为0 (2).普通用户具有操作系统有限的权限UID值500~6000 (3).伪用户是为了方便系统 ...
- HLS直播技术方案及踩过的坑
一.为什么是IJKPlayer 在基础技术方面,后端有比較成熟的系统,就不再说了,这里说说client方面. 有直播就会有弹幕.基本上是标配了. 字幕方面bilibili开源了一个Android的项目 ...
- Style contains key with bad entry
出现Style contains key with bad entry错误,检查权限是否配置好
- NEU操作系统实验课4——线程同步
实验要求: 创建两个线程按数字顺序打印10以下自然数,其中一个线程打印1-3及8-10:另一个线程打印4-6.要求使用线程同步机制实现上述打印顺序. 看网上的资料学习了两种写法 C++11的,使用了s ...
- Linux Oracle服务启动&停止脚本与开机自启动
在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...
- 谈谈cookie的弊端
一.cookie虽然在数据在客户端持久存储提供了方便,但是分担了服务器数据传输的负担,还是存在很大的局限性的. 局限性: (1)在特定的域名下最多存储20个cookie. 浏览器版本 ...
- BPM中字段查重,C#Ajac调用示例
BPM中字段查重记录: 这也算是一个C#调用Ajax的示例吧,如果是异步加载的话async: false去掉就可以了. 需求:比如现在要录入一些信息,但是,有一个字段不能重复,BPM表都是自己生成的, ...
- javascript中caller和callee call和apply
Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n] 参数function :选项.当前正在执行的 Function 对象的名字. n ...
- BZOJ4518: [Sdoi2016]征途(dp+斜率优化)
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1875 Solved: 1045[Submit][Status][Discuss] Descript ...
- Android 解决toolbar标题不显示问题
问题原因:toolbar的兼容性有问题 解决办法: setSupportActionBar(toolbar); toolbar使用步骤: 1.编写menu.xml 为了保持兼容需要这样写: andro ...