/*
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. POJ3126——Prime Path

    非常水的一道广搜题(专业刷水题). .. #include<iostream> #include<cstdio> #include<queue> #include& ...

  2. luogu3197 [HNOI2008] 越狱

    题目大意 已知序列$P$满足$|P|=N$,(以下所有$i,i\in[1,N]$)$\forall i, P_i\in [1,M]$.求$|\{P|\exists i, P_i =P_{i+1}\}| ...

  3. luogu1168 中位数

    题目大意 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], -, A[2k - 1]的中位数.即前1,3,5,--个数的中位数. 题解 ...

  4. BZOJ1053 反素数

    题目大意 对于任何正整数x,其约数的个数记作g(x).如果某个正整数x满足对任意的0<i<x,都有g(x)>g(i) ,则称x为反质数.现在给定一个数N,求出不超过N的最大的反质数. ...

  5. hdoj--1598--find the most comfortable road

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  6. 使用fastcgi部署django应用

    1.fastcgi和cgi的区别 1)CGI (Common Gateway Interface): 用来作为 Web Server 同 Python, PHP 等的通信手段.而在静态网页的时代, 只 ...

  7. [CF1139 E] Maximize Mex 解题报告 (二分图匹配)

    interlinkage: https://codeforces.com/contest/1139/problem/E description: 有$n$个学生,$m$个社团,每个学生有一个能力值,属 ...

  8. Spark Streaming概念学习系列之SparkStreaming性能调优

    SparkStreaming性能调优 合理的并行度 减少批处理所消耗时间的常见方式还有提高并行度.有以下三种方式可以提高并行度: 1.增加接收器数目 有时如果记录太多导致单台机器来不及读入并分发的话, ...

  9. mysql基础知识点梳理

    ##本单元目标 一.为什么要学习数据库 二.数据库的相关概念DBMS.DB.SQL 三.数据库存储数据的特点 四.初始MySQL MySQL产品的介绍MySQL产品的安装 ★MySQL服务的启动和停止 ...

  10. html中常见的小问题(1)

    问题:自适应高度的块级元素内添加图片后,其高度会比图片高度多出一块 简单代码如下: <!doctype html> <html> <head> <style& ...