pro:A的监视区域是一个多边形。 如果A的监视区的内满足到A的距离到不超过到B的距离的K倍的面积大小。K<1

sol:高中几何体经验告诉我们满足题意的区域是个圆,那么就是求圆与多边形的交。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const double eps=1e-;
struct point{
double x,y;
point(){}
point(double xx,double yy):x(xx),y(yy){}
};
struct Circle{
point c; double r;
};
double det(point a,point b){ return a.x*b.y-a.y*b.x;}
double dot(point a,point b){ return a.x*b.x+a.y*b.y;}
point operator *(point a,double t){ return point(a.x*t,a.y*t);}
point operator +(point a,point b){ return point(a.x+b.x,a.y+b.y);}
point operator -(point a,point b){ return point(a.x-b.x,a.y-b.y);}
double Length(point A){return sqrt(dot(A,A));}
int dcmp(double x){
if(fabs(x)<eps) return ; if(x<) return -; return ;
}
double TriAngleCircleInsection(Circle C, point A, point B)
{
point OA=A-C.c,OB=B-C.c;
point BA=A-B, BC=C.c-B;
point AB=B-A, AC=C.c-A;
double DOA=Length(OA),DOB=Length(OB),DAB=Length(AB),r=C.r;
if(dcmp(det(OA,OB))==) return ; //,三点一线,不构成三角形
if(dcmp(DOA-C.r)<&&dcmp(DOB-C.r)<) return det(OA,OB)*0.5; //内部
else if(DOB<r&&DOA>=r) //一内一外
{
double x=(dot(BA,BC)+sqrt(r*r*DAB*DAB-det(BA,BC)*det(BA,BC)))/DAB;
double TS=det(OA,OB)*0.5;
return asin(TS*(-x/DAB)*/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-det(AB,AC)*det(AB,AC)))/DAB;
double TS=det(OA,OB)*0.5;
return asin(TS*(-y/DAB)*/r/DOB)*r*r*0.5+TS*y/DAB;
}
else if(fabs(det(OA,OB))>=r*DAB||dot(AB,AC)<=||dot(BA,BC)<=)//弧
{
if(dot(OA,OB)<){
if(det(OA,OB)<) return (-acos(-1.0)-asin(det(OA,OB)/DOA/DOB))*r*r*0.5;
else return ( acos(-1.0)-asin(det(OA,OB)/DOA/DOB))*r*r*0.5;
}
else return asin(det(OA,OB)/DOA/DOB)*r*r*0.5; //小于90度,以为asin对应的区间是[-90度,90度]
}
else //弧+三角形
{
double x=(dot(BA,BC)+sqrt(r*r*DAB*DAB-det(BA,BC)*det(BA,BC)))/DAB;
double y=(dot(AB,AC)+sqrt(r*r*DAB*DAB-det(AB,AC)*det(AB,AC)))/DAB;
double TS=det(OA,OB)*0.5;
return (asin(TS*(-x/DAB)*/r/DOA)+asin(TS*(-y/DAB)*/r/DOB))*r*r*0.5 + TS*((x+y)/DAB-);
}
}
point a[maxn];
int main()
{
int N,T,Ca=; double K,ans;
while (~scanf("%d%lf",&N,&K)) {
rep(i,,N) scanf("%lf%lf",&a[i].x,&a[i].y);
a[N+]=a[];
point A,B; Circle C;
scanf("%lf%lf",&A.x,&A.y);
scanf("%lf%lf",&B.x,&B.y);
K=K*K;
C.c.x=(B.x-A.x*K)/(-K);
C.c.y=(B.y-A.y*K)/(-K);
double ta=(K*A.x*A.x-B.x*B.x)/(-K);
double tb=pow((K*A.x-B.x)/(-K),);
double tc=(K*A.y*A.y-B.y*B.y)/(-K);
double td=pow((K*A.y-B.y)/(-K),);
C.r=sqrt(ta+tb+tc+td); ans=;
rep(i,,N){
ans+=TriAngleCircleInsection(C,a[i],a[i+]);
}
printf("Case %d: %.10lf\n",++Ca,fabs(ans));
}
return ;
}

HDU - 5130 :Signal Interference (多边形与圆的交)的更多相关文章

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

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

  2. hdu 4404 Worms(多边形与圆的交)

    求出爆炸点的坐标,就成了多边形与圆相交面积的模板题了... #include<algorithm> #include<iostream> #include<cstring ...

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

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

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

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

  5. HDU5130 Signal Interference

    /* HDU5130 Signal Interference http://acm.hdu.edu.cn/showproblem.php?pid=5130 计算几何 圆与多边形面积交 * */ #in ...

  6. AMap编辑折线、多边形、圆

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. poj3675 求多边形与圆的面积交

    题意:给出多边形的顶点坐标.圆的圆心坐标和半径,求面积交 sol:又是模板题啦= = 注意poj的C++好像认不出hypot函数,要稍微改写一下. hypot(double x,double y):即 ...

  8. C++实现glut绘制点、直线、多边形、圆

    C++实现glut绘制点.直线.多边形.圆 必备环境 glut.h 头文件 glut32.lib 对象文件库 glut32.dll 动态连接库 程序说明 C++实现了用glut画点.画直线.画多边形和 ...

  9. 牛客网暑期ACM多校训练营(第三场)J 多边形与圆相交的面积

    链接:https://www.nowcoder.com/acm/contest/141/J 题目描述 Eddy has graduated from college. Currently, he is ...

随机推荐

  1. moment.js 常用(几天前、相差几天、自然周、自然月)

    let pickDate = moment(this.searchForm.date); let firstDay = pickDate.day(0).format('YYYYMMDD');//上周天 ...

  2. Windows设置.txt文件默认打开程序

    一.配置某个程序默认打开哪些类型的文件(以firefox为例) 依次打开”控制面板\程序\默认程序“,点击”设置默认程序“ 在右侧列表找到firefox,选中 以firefox为例,”将此程序设置为默 ...

  3. Apache支持TRACE请求漏洞处理方案

    trace和get一样是http的一种请求方法,该方法的作用是回显收到的客户端请求,一般用于测试服务器运行状态是否正常. 该方法结合浏览器漏洞可能造成跨站脚本攻击.修复方法如下: 编缉/etc/htt ...

  4. for循环跳转语句(break、continue)

    跳转语句用于实现循环执行过程中程序流程的跳转,在Java中的跳转语句有break语句和continue语句.接下来分别进行详细地讲解. 1. break语句 在switch条件语句和循环语句中都可以使 ...

  5. vbox 虚拟机添加usb

    先装扩展包. vbox 所在的用户组比如要包括当前用户才行. 查看当前用户名:sharl@sharl-laptop:~$ whoamisharl 查看vbox 所在的组:sharl@sharl-lap ...

  6. 大白菜装机版一键制作启动u盘教程

    第一步 下载并且安装好大白菜装机版,打开安装好的大白菜装机版,插入u盘等待软件成功读取到u盘之后,点击“一键制作启动u盘”进入下一步操作.如下图所示 第二步 在弹出的信息提示窗口中,点击“确定”进入下 ...

  7. bzoj1968

    题解: 显然每一个数对答案的贡献为n/i 代码: #include<bits/stdc++.h> using namespace std; int n; int main() { scan ...

  8. 每天CSS学习之border-collapse

    border-collapse是CSS2的一个属性,其作用是折叠表格(table)的边框.collapse翻译过来又折叠的意思. border-collapse有三个值: collapse:将表格和单 ...

  9. mysql存储过程中使用游标

    用户变量一般以@开头,作用于全局范围 局部变量需用 declare 定义格式为 declare 变量名 数据类型 [default value]; mysql 数据类型有 int ,float,dat ...

  10. Cracking The Coding Interview 4.6

    //原文: // // Design an algorithm and write code to find the first common ancestor of two nodes in a b ...