HDU 1756 Cupid's Arrow (几何问题,判定点在多边形内部)
题意:中文的么,自己看喽。
析:很容易明白是判定点是不是在多边形内部,一般是向量来判定,我一开始用点在向量的右侧,因为是顺时针给的,只要点全在外侧或边上,
就可以,暴力一下就ok。由于这个是浮点数,一定要注意精度,也就是误差,结果WA了好几次,一气之下,我改了算法,采用转角法,
假想有一条向右的射线,统计多边形穿过这条射线正反多少次,顺时针减1,逆时针加1。一定要注意这个精度控制,不然就WA。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath> using namespace std;
const double eps = 1E-10;
const int maxn = 100 + 10;
struct node{
double x, y;
node() { }
node(double xx, double yy) : x(xx), y(yy) { }
};
node operator + (node A, node B) { return node(A.x+B.x, A.y+B.y); }
node operator - (node A, node B) { return node(A.x-B.x, A.y-B.y); }
int n;
node a[maxn]; int dcmp(double x){
if(fabs(x) < eps) return 0;
else return x < 0 ? -1 : 1;
} double cross(node A, node B){ return A.x * B.y - A.y * B.x; } bool solve(node p){
int wn = 0;
for(int i = 0; i < n; ++i){
int k = dcmp(cross(a[(i+1)%n]-a[i], p-a[i]));
int d1 = dcmp(a[i].y-p.y);
int d2 = dcmp(a[(i+1)%n].y-p.y);
if(k > 0 && d1 <= 0 && d2 > 0) ++wn;
if(k < 0 && d2 <= 0 && d1 > 0) --wn;
}
if(wn != 0) return true;
return false;
} int main(){
int m;
while(~scanf("%d", &n)){
for(int i = 0; i < n; ++i) scanf("%lf %lf", &a[i].x, &a[i].y);
scanf("%d", &m);
while(m--){
double x, y;
scanf("%lf %lf", &x, &y);
if(solve(node(x, y))) puts("Yes");
else puts("No");
}
}
return 0;
}
HDU 1756 Cupid's Arrow (几何问题,判定点在多边形内部)的更多相关文章
- HDU 1756 Cupid's Arrow 判断点在多边形的内部
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 1756 Cupid's Arrow 计算几何 判断一个点是否在多边形内
LINK:Cupid's Arrow 前置函数 atan2 返回一个向量的幅角.范围为[Pi,-Pi) 值得注意的是 返回的是 相对于x轴正半轴的辐角. 而判断一个点是否在一个多边形内 通常有三种方法 ...
- HDU 1756 Cupid's Arrow( 判断点在多边形的内外 )
链接:传送门 思路:判断每支箭是否在多边形内,计算几何点定位中水题,不清楚下面的代码能不能适用于给定点的顺序不确定( 既不是顺时针又不是逆时针 ) /************************* ...
- 【HDOJ】1756 Cupid's Arrow
图论,点在多边形内部的判定. /* 1756 */ #include <iostream> #include <string> #include <map> #in ...
- hdu 1756(判断点是否在多边形中)
传送门 题解: 射线法判定点是否在多边形内部: AC代码: #include<iostream> #include<cstdio> #include<cmath> ...
- Cupid's Arrow[HDU1756]
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 3594 Cactus /uva 10510 仙人掌图判定
仙人掌图(有向):同时满足:1强连通:2任何边不在俩个环中. 个人理解:其实就是环之间相连,两两只有一个公共点,(其实可以缩块),那个公共点是割点.HDU数据弱,网上很多错误代码和解法也可以过. 个人 ...
- HDU 2444 The Accomodation of Students 二分图判定+最大匹配
题目来源:HDU 2444 The Accomodation of Students 题意:n个人能否够分成2组 每组的人不能相互认识 就是二分图判定 能够分成2组 每组选一个2个人认识能够去一个双人 ...
随机推荐
- 使用root用户,在centos7中安装rabbitMQ
参考地址: https://www.linuxidc.com/Linux/2018-01/150600.htm https://blog.csdn.net/summerhust/article/det ...
- 四大域对象,和jsp的九大隐式对象,已经el表达式的11个隐式对象
四大域对象 1.PageContext :页面范围的数据 2.ServletRequest:请求范围的数据 3.HttpSession:回话范围的数据 4.ServletContext:应用范围的数据 ...
- tesseract 4.0 编译安装(CentOS)
1.安装依赖工具 yum install autoconf automake libtool libjpeg-devel libpng-devel libtiff-devel zlib-devel 2 ...
- webrtc 开发之前必须了解的东西
1.创建offer的时候带上参数:{ offerToReceiveAudio: true, offerToReceiveVideo: true } 2.onicecandidate 必须写在 setL ...
- Guava Cache -- MapMaker.makeComputingMap测试
canal中很多处使用了MigrateMap.makeComputingMap(Function<? super K, ? extends V> computingFunction)方法, ...
- iOS 静态库的封装
参考网址:http://www.jianshu.com/p/b754709135fb http://www.jianshu.com/p/443a5b8f3894 注意:封装静态库时要注意的地方: ...
- 【Python基础教程第2版】——第一讲:基础知识
1.长字符串:(用三引号如'''或者"""来引起来) >>> print """This is a very log st ...
- PAT L2-008 最长对称子串(模拟字符串)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
- 24-filter-拦截器
在web.xml里面配置,有两种形式: 然后编写filter类: @Override public void doFilter(ServletRequest arg0, ServletResponse ...
- 【Spring】Spring boot多数据源历险记
一.问题描述 笔者根据需求在开发过程中,需要在原项目的基础上(单数据源),新增一个数据源C,根据C数据源来实现业务.至于为什么不新建一个项目,大概是因为这只是个小功能,访问量不大,不需要单独申请个服务 ...