SCUT - 244 - 全新的游戏 - 凸包
https://scut.online/p/244
除了常规的求凸包求面积,还有一个判断点在凸包内,先找出点所在的三角扇区。
#include<bits/stdc++.h>
using namespace std;
#define ll long long /****************************凸包模板*******************************/ const double eps = 1e-; int sgn(double x) {
if(fabs(x) < eps)
return ;
if(x < )
return -;
else
return ;
} struct Point {
double x,y;
Point() {}
Point(double _x,double _y) {
x = _x;
y = _y;
} Point operator -(const Point &b)const {
return Point(x - b.x,y - b.y);
} //叉积
double operator ^(const Point &b)const {
return x*b.y - y*b.x;
} //点积
double operator *(const Point &b)const {
return x*b.x + y*b.y;
} void input() {
scanf("%lf%lf",&x,&y);
} void output() {
printf("(%.2f,%.2f)\n",x,y);
} }; struct Line { Point s,e; Line() {} Line(Point _s,Point _e) { s = _s;
e = _e; } }; //*两点间距离 double dist(Point a,Point b) { return sqrt((a-b)*(a-b)); } /* * 求凸包,Graham算法 * 点的编号0~n-1 * 返回凸包结果Stack[0~top-1]为凸包的编号 */ const int MAXN = +; Point List[MAXN]; int Stack[MAXN];//用来存放凸包的点 int top;//表示凸包中点的个数 //相对于List[0]的极角排序 bool _cmp(Point p1,Point p2) {
double tmp = (p1-List[])^(p2-List[]);
if(sgn(tmp) > )
return true;
else if(sgn(tmp) == && sgn(dist(p1,List[]) - dist(p2,List[])) <= )
return true;
else
return false;
} Point p[MAXN]; void Graham(int n) {
Point p0;
int k = ;
p0 = List[];
//找最下边的一个点
for(int i = ; i < n; i++) {
if((p0.y>List[i].y) || (p0.y == List[i].y && p0.x > List[i].x) ) {
p0 = List[i];
k = i;
}
}
swap(List[k],List[]);
sort(List+,List+n,_cmp);
if(n == ) {
top = ;
Stack[] = ;
return;
}
if(n == ) {
top = ;
Stack[] = ;
Stack[] = ;
return ;
}
Stack[] = ;
Stack[] = ;
top = ;
for(int i = ; i < n; i++) {
while(top > && sgn((List[Stack[top-]]-List[Stack[top-]])^(List[i]-List[Stack[top-]])) <= )
top--;
Stack[top++] = i;
} for(int i=;i<top;i++){
p[i]=List[Stack[i]];
}
} bool inside(Point A) {
int l=,r=top-,mid;
while(l<=r) {
mid=(l+r)>>;
double a1=(p[mid]-p[])^(A-p[]);
double a2=(p[mid+]-p[])^(A-p[]);
if(sgn(a1)>=&&sgn(a2)<=) {
if(sgn((p[mid+]-p[mid])^(A-p[mid]))>=)
return true;
return false;
}
else if(a1<) {
r=mid-;
}
else {
l=mid+;
}
}
return false;
}
/****************************凸包模板*******************************/
int main() {
int n;
while(~scanf("%d",&n)){
double x,y;
for(int i=;i<n;i++) {
scanf("%lf%lf",&x,&y);
List[i].x=x;
List[i].y=y;
}
Graham(n);
/*for(int i=0; i<top; i++) {
List[Stack[i]].output();
}*/ double area=0.0;
Point o(,);
for(int i=; i<top; i++) {
area+=(List[Stack[i]]-o)^(List[Stack[(i+top-)%top]]-o);
} area*=0.5;
area=fabs(area); printf("%.6f\n",area); int m;
scanf("%d",&m);
while(m--){
double x,y;
scanf("%lf%lf",&x,&y);
if(inside(Point(x,y))){
printf("Yes\n");
}
else{
printf("No\n");
}
}
}
}
SCUT - 244 - 全新的游戏 - 凸包的更多相关文章
- 映众全新游戏内存条发布:单条16GB 最高4000MHz
近日,显卡与内存厂商映众(INNO3D)推出了一款全新的游戏内存条产品——iCHILL Memory. iCHILL Memory是DDR4内存,单条容量有4GB-16GB可选,内存频率有2400MH ...
- 爆款AR游戏如何打造?网易杨鹏以《悠梦》为例详解前沿技术
本文来自网易云社区. 7月31日,2018云创大会游戏论坛在杭州国际博览中心103B圆满举行.本场游戏论坛聚焦探讨了可能对游戏行业发展有重大推动的新技术.新实践,如AR.区块链.安全.大数据等. 网易 ...
- 如何平衡MMO游戏
转自:http://blog.sina.com.cn/s/blog_9f56a65f01013eti.html 前言 这是一篇出自国外博客“Elder Game”的一篇文章,笔者觉得里面很多东西说的很 ...
- 游戏数值——LOL篇 以LOL为起点-说游戏数值设计核心思路
附 文 文档在今年三月份我动笔写了一小部分,但当时思路凌乱,行文梗阻,于是丢在一边构思了半年,现在又回过头来慢慢写,希望能写好写完吧,初衷是希望即时萌新也能看懂,但是好像并不能行——本 ...
- (转)iOS Wow体验 - 第三章 - 用户体验的差异化策略
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第三章译文精选,其余章节将陆续放出.上一篇:Wow ...
- [Cocos2d-x]Lua 资源热更新
什么是热更新 所谓的热更新,指的是客户端的更新. 大致的流程是,客户端在启动后访问更新的URL接口,根据更新接口的反馈,下载更新资源,然后使用新的资源启动客户端,或者直接使用新资源不重启客户端. 热更 ...
- js实现在光标的位置 添加内容
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 朴素贝叶斯文本分类实现 python cherry分类器
贝叶斯模型在机器学习以及人工智能中都有出现,cherry分类器使用了朴素贝叶斯模型算法,经过简单的优化,使用1000个训练数据就能得到97.5%的准确率.虽然现在主流的框架都带有朴素贝叶斯模型算法,大 ...
- 专家来“搞”| IoT DevKit,物联网界新手大礼包等你来拿
专家来“搞” 这是一档基于近期热门云技术,邀请 IT 和开发领域的资深专家,来给大家分享不同领域的云技术操作环境及开发过程中经常遇到的痛点和解决方案,与实战紧密相连,帮助大家学习知识点,顺利解决工作中 ...
随机推荐
- 用df命令显示磁盘使用量和占用率。
使用“df -k”命令,以k为单位显示磁盘使用量和占用率. root@gsg43:/tmp# df -kFilesystem 1K-blocks Used Available Use% ...
- 基于 orange(nginx+openresty) + docker 实现微服务 网关功能
摘要 基于 orange(nginx+openresty) + docker 实现微服务 网关功能 ;以实现 docker 独立容器 来跑 独立语言独立环境 在 同一个授权下 运行相关组合程序..年初 ...
- apache多网站配置
前言 虽说apache安装好后给了我们一个默认的一个网站.并且我们还能够将这个默认的网站改动成我们自己的网站.可是这似乎还不能全然满足我们的须要,由于当我们要在本机上开发(phpWeb)或者測试另外 ...
- 芯片史称:“长平之战”----Intel的东进与ARM的西征(3)--人生如戏,全靠演技
http://www.36kr.com/p/177143.html 从 2003 年到 2008 年,处理器双雄 Intel 和 AMD 在 64 位 CPU 领域展开了一场长达五年,极为惨烈的科技战 ...
- NYOJ 1067 Compress String(区间dp)
Compress String 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描写叙述 One day,a beautiful girl ask LYH to help he ...
- PHP中include路径修改
1.__FILE__ __FILE__ always equals to the real path of a php script regardless whether it's included. ...
- 继承LinearLayout实现根据屏幕宽度及内部子View个数自动排布GridView
public class VerticalSearchGridView extends LinearLayout implements View.OnClickListener { private i ...
- 浅谈JavaScript的事件(事件委托)
事件处理程序为Web程序提供了系统交互,但是如果页面中的事件处理程序太多,则会影响页面的性能.每个函数都是对象,都会占用内存,内存中对象越多,性能越差.需要事先为DOM对象指定事件处理程序,导致访问D ...
- android自己定义开关控件
近日在android项目要使用开关控件.可是android中自带的开关控件不太惬意,所以就打算通过自己定义View写一个开关控件 ios的开关控件当然就是我要仿照的目标. 先上图: waterma ...
- jquery 选择器(selector)和事件(events)
页面加载完成后开始运行do stuff when DOM is ready 中的语句! $(document).ready(function() { // do stuff when DO ...