博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2540 Hotter Colder(极角计算半平面交)
阅读量:6263 次
发布时间:2019-06-22

本文共 2408 字,大约阅读时间需要 8 分钟。

题意:玩家A初始时在(0,0)位置,每移动一次,玩家B提示与目标位置的距离远了、近了还是不变;在B回答后,确定目标位置可能存在的区域面积;

思路:以玩家A上一个位置与当前位置的连线做中垂线,将目标位置代入中垂线方程,得到对应不等式,根据回答的类型增加相应的半平面;

        每回合后对当前半平面求交,输出交的面积;

#include
#include
#include
#include
#include
#include
#include
using namespace std;const double epsi=1e-10;const int maxn=20100;const double pi=acos(-1.0);struct point{ double x,y; point(double xx=0,double yy=0):x(xx),y(yy){} double operator ^(const point &op2) const{ return x*op2.y-y*op2.x; }};struct line{ double A,B,C; line(double aa=0,double bb=0,double cc=0):A(aa),B(bb),C(cc){} double f(const point &p) const{ return A*p.x+B*p.y+C; //计算p点代入直线方程后的解 } double rang() const{ return atan2(B,A);//直线的极角 } double d() const{ return C/(sqrt(A*A+B*B));//原点到直线的距离 } point cross(const line &a)const{ double xx=-(C*a.B-a.C*B)/(A*a.B-B*a.A); double yy=-(C*a.A-a.C*A)/(B*a.A-a.B*A); return point(xx,yy); //计算直线与直线a的交点 }};line b[maxn],SL[maxn],S[maxn]; //当前核边的直线序列b[],多边形的边序列SL[],s[]暂存半平面point c[maxn],d[maxn]; //当前核的顶点序列c[],核的顶点序列d[]int n;inline int sign(const double &x){ if(x>epsi) return 1; if(x<-epsi) return -1; return 0;}int cmp(line a,line b){ //极角作为第一关键字,原点至该直线的距离作为第二关键字比较直线a和直线b的大小 if(sign(a.rang()-b.rang())!=0) return a.rang()
0的边 if(sign(a[i].rang()-a[i-1].rang())!=0) a[++tn]=a[i]; if(sign(a[tn].A)==0&&sign(a[tn].B)==0) if(sign(a[tn].C)==1) tn--;//若C>0则移出a[];否则返回失败标志 else return -1; } n=tn; //a预处理后的长度 int h=0,t=1; //队列的首尾指针初始化 b[0]=a[1]; b[1]=a[2]; c[1]=b[1].cross(b[0]); //直线1和直线2存入a,交点存入c for(int i=3;i<=n;i++){ //枚举直线3到直线n while(h
<0) t--; //若队列c非空且c的队尾交点代入直线i后的方程值为负,则队尾元素退出 while(h
<0) h++;//若队列c非空且c的队首交点代入直线i后的方程值为负,则队首元素退出 b[++t]=a[i]; //直线i进入b的队尾 c[t]=b[t].cross(b[t-1]); //b队尾的两条直线交点进入c队尾 } while(h
<0) t--; while(h
<0) h++; if(h+1>=t) return -1; //若队列空,则失败返回 pt[0]=b[h].cross(b[t]); //b的首尾两条直线的交点作为凸多边形的首顶点 for(int i=h;i
>c; if(c[0]=='C') //根据提示,增添相应的平面 SL[++n]=line(-2*(nx-px),-2*(ny-py),-(px*px+py*py-nx*nx-ny*ny)); else if(c[0]=='H') SL[++n]=line(2*(nx-px),2*(ny-py),(px*px+py*py-nx*nx-ny*ny)); else SL[++n]=line(-2*(nx-px),-2*(ny-py),-(px*px+py*py-nx*nx-ny*ny)), SL[++n]=line(2*(nx-px),2*(ny-py),(px*px+py*py-nx*nx-ny*ny)); px=nx,py=ny; ans=0; //for(int i=1;i<=n;i++) S[i]=SL[i]; m=half_plane_cross(SL,n,d); if(m==-1) printf("0.00\n"); else{ for(int i=0;i

 

转载于:https://www.cnblogs.com/dashuzhilin/p/4556571.html

你可能感兴趣的文章
java多线程系列2-线程控制
查看>>
godep 包管理工具
查看>>
爬虫工程师要求
查看>>
Linux 远程查看tomcat控制台
查看>>
【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)...
查看>>
[转] “error LNK2019: 无法解析的外部符号”之分析
查看>>
演示-JQuery关系选择器
查看>>
微信支付接口之jsApiPay教程
查看>>
C#十种语法糖
查看>>
PHP 如何显示大数字,防止显示为 科学计数法 形式
查看>>
数据扩展性探讨和总结--转
查看>>
spider RPC高级特性
查看>>
C# 导出资源文件到硬盘
查看>>
修复 ThinkPHP3.2.3 抛出异常模块的一个BUG,关闭字段缓存功能
查看>>
更改MySQL数据库的编码为utf8mb4
查看>>
android自动化测试--appium运行的坑问题及解决方法
查看>>
mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
查看>>
TeamCity : .NET Core 插件
查看>>
Python 爬虫知识点 - XPath
查看>>
由数量众多照片拼贴而成的马赛克图片
查看>>