/*
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的更多相关文章

  1. HDU 5130 Signal Interference(计算几何 + 模板)

    HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...

  2. HDU 5130 Signal Interference --计算几何,多边形与圆的交面积

    题意: 求所有满足PB <= k*PA 的P所在区域与多边形的交面积. 解法: 2014广州赛区的银牌题,当时竟然没发现是圆,然后就没做出来,然后就gg了. 圆的一般式方程: 设A(x1,y1) ...

  3. 简单几何(圆与多边形公共面积) UVALive 7072 Signal Interference (14广州D)

    题目传送门 题意:一个多边形,A点和B点,满足PB <= k * PA的P的范围与多边形的公共面积. 分析:这是个阿波罗尼斯圆.既然是圆,那么设圆的一般方程:(x + D/2) ^ 2 + (y ...

  4. HDU - 5130 :Signal Interference (多边形与圆的交)

    pro:A的监视区域是一个多边形. 如果A的监视区的内满足到A的距离到不超过到B的距离的K倍的面积大小.K<1 sol:高中几何体经验告诉我们满足题意的区域是个圆,那么就是求圆与多边形的交. # ...

  5. LA 7072 Signal Interference 计算几何 圆与多边形的交

    题意: 给出一个\(n\)个点的简单多边形,和两个点\(A, B\)还有一个常数\(k(0.2 \leq k < 0.8)\). 点\(P\)满足\(\left | PB \right | \l ...

  6. FBOSS: Building Switch Software at Scale

    BOSS: 大规模环境下交换机软件构建 本文为SIGCOMM 2018 论文,由Facebook提供. 本文翻译了论文的关键内容. 摘要: 在网络设备(例如交换机和路由器)上运行的传统软件,通常是由供 ...

  7. PatentTips - Solid State Disk (SSD) Device

    BACKGROUND OF THE INVENTION A SSD apparatus is a large-capacity data storage device using a nonvolat ...

  8. 第八届河南省赛G.Interference Signal(dp)

    G.Interference Signal Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 35  Solved: 17 [Submit][Status ...

  9. G.Interference Signal---河南省第八届程序设计大赛(dp)

    G.Interference Signal 时间限制: 2 Sec  内存限制: 128 MB提交: 47  解决: 18[提交][状态] 题目描述 Dr.Kong’s laboratory moni ...

随机推荐

  1. 去掉文本框前后的空格(JS+JQuery)

    表单验证时,需要去除文本框前后的空格才可以正确通过验证.以前看到过一句话:任何设计和代码都要对用户足够宽容. <input type="text" class="p ...

  2. C#之打印乘法表

    设计说明 由图可知: 1.我们需要打印出九行: 2.每行中最大列数等于行数: 代码实现 public void Display1() { Console.WriteLine("乘法表:&qu ...

  3. Codeforces Round #244 (Div. 2)D (后缀自己主动机)

    Codeforces Round #244 (Div. 2)D (后缀自己主动机) (标号为0的节点一定是null节点,不管怎样都不能拿来用,切记切记,以后不能再错了) 这题用后缀自己主动机的话,对后 ...

  4. MongoDB索引05-30学习笔记

    MongoDB 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录. 这种扫描全集合的查询效率是非常低的,特别在处理大 ...

  5. POJ 1703 带权并查集

    直接解释输入了: 第一行cases. 然后是n和m代表有n个人,m个操作 给你两个空的集合 每个操作后面跟着俩数 D操作是说这俩数不在一个集合里. A操作问这俩数什么关系 不能确定:输出Not sur ...

  6. RDS中的.frm和.ibd文件转换为sql文件

    --- 转自他人 mysql存储在磁盘中,各种天灾人祸都会导致数据丢失.大公司的时候我们常常需要做好数据冷热备,对于小公司来说要做好所有数据备份需要支出大量的成本,很多公司也是不现实的.万一还没有做好 ...

  7. [] == ![]为什么是true

    我们先来考虑这个问题,console.log([] == false)会打印什么呢? 答案是true.为什么呢? 首先,因为当"=="号两边其中一个是布尔值的话,先把它转换为数字( ...

  8. showdialog

    在C#中窗口的显示有两种方式:模态显示(showdialog)和非模态显示(show). 区别: 模态与非模态窗体的主要区别是窗体显示的时候是否可以操作其他窗体.模态窗体不允许操作其他窗体,非模态窗体 ...

  9. javascript中天气接口案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Sql Server 连接池

    在看缓存的一篇文章中,看到连接池的三个字,来充充电. 原文连接 这篇讲了关键字 其实我们一直在使用SqlServer的连接池.在连接字符串中,Pooling为是否启用连接池,默认值为true,表示启用 ...