[HDU1756]Cupid's Arrow
题目大意:
给你一个简单多边形和若干个点,问每个点在多边形内还是外。
思路:
一开始没看清楚题,写了一个叉积法,事实上叉积法只能用来处理凸多边形与点的关系。
考虑一个射线法。
从这个点水平往左作一条射线,如果与多边形相交次数为偶数,则在多边形外,否则在多边形内。
考虑一些特殊情况:
1.射线与多边形某条边重合,不算。
2.射线经过某个顶点,只能够算一次。
对于第一种情况,我们只需要判一下是否平行即可,对于第二种情况,我们对于多边形上的边区分一下上顶点和下顶点即可,上顶点算,下顶点不算。
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
struct Point {
double x,y;
};
Point p[N];
int main() {
int n;
while(~scanf("%d",&n)) {
for(register int i=;i<n;i++) {
p[i]=(Point){getint(),getint()};
}
for(register int m=getint();m;m--) {
const Point q=(Point){getint(),getint()};
int cnt=;
if(p[].y==p[n-].y) {
} else if(p[].x==p[n-].x) {
if(p[].x<q.x&&std::min(p[].y,p[n-].y)<q.y&&q.y<=std::max(p[].y,p[n-].y)) {
cnt++;
}
} else if((q.y-p[n-].y)/((p[].y-p[n-].y)/(p[].x-p[n-].x))+p[n-].x<=q.x) {
if(std::min(p[].y,p[n-].y)<q.y&&q.y<=std::max(p[].y,p[n-].y)) {
cnt++;
}
}
for(register int i=;i<n;i++) {
if(p[i].y==p[i-].y) {
} else if(p[i].x==p[i-].x) {
if(p[i].x<q.x&&std::min(p[i].y,p[i-].y)<q.y&&q.y<=std::max(p[i].y,p[i-].y)) {
cnt++;
}
} else if((q.y-p[i-].y)/((p[i].y-p[i-].y)/(p[i].x-p[i-].x))+p[i-].x<=q.x) {
if(std::min(p[i].y,p[i-].y)<q.y&&q.y<=std::max(p[i].y,p[i-].y)) {
cnt++;
}
}
}
puts((cnt&)?"Yes":"No");
}
}
return ;
}
[HDU1756]Cupid's Arrow的更多相关文章
- Cupid's Arrow[HDU1756]
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(计算几何,判断点在多边形内)
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 Cupid's Arrow (几何问题,判定点在多边形内部)
题意:中文的么,自己看喽. 析:很容易明白是判定点是不是在多边形内部,一般是向量来判定,我一开始用点在向量的右侧,因为是顺时针给的,只要点全在外侧或边上, 就可以,暴力一下就ok.由于这个是浮点数,一 ...
- ACM第一阶段学习内容
一.知识目录 字符串处理 ................................................................. 3 1.KMP 算法 .......... ...
- 下载恶意pcap包的网站
说几个我经常用的,免费的:1. Malware Traffic Analysis: http://www.malware-traffic-analysis.net/2018/index.htm ...
随机推荐
- Python中的异常处理 -- (转)
python中的异常 异常是指程序中的例外,违例情况.异常机制是指程序出现错误后,程序的处理方法.当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理. Exception类是常用的异 ...
- 抓起根本(二)(hdu 4554 叛逆的小明 hdu 1002 A + B Problem II,数字的转化(反转),大数的加法......)
数字的反转: 就是将数字倒着存下来而已.(*^__^*) 嘻嘻…… 大致思路:将数字一位一位取出来,存在一个数组里面,然后再将其变成数字,输出. 详见代码. while (a) //将每位数字取出来, ...
- Spring注解@Resource和@Autowired区别对比、spring扫描的默认bean的Id、程序获取spring容器对象
-------------------------注解扫面的bean的ID问题-------------------------- 0.前提需要明白注解扫描出来的bean的id默认是类名首字母小写,当 ...
- Java 关于微信公众号支付总结附代码
很多朋友第一次做微信支付的时候都有蒙,但当你完整的做一次就会发现其实并没有那么难 业务流程和应用场景官网有详细的说明:https://pay.weixin.qq.com/wiki/doc/api/js ...
- [device tree] interrupt
Specifying interrupt information for devices ============================================ 1) Interru ...
- 网络知识===wireshark抓包出现“TCP segment of a reassembled PDU”的解释(载)
网上胡说八道,众说风云,感觉这篇还算靠谱点. 原文链接:http://blog.csdn.net/dog250/article/details/51809566 为什么大家看到这个以后总是会往MSS, ...
- mount/umount命令【转】
转自:http://www.cnblogs.com/qq78292959/archive/2012/03/06/2382334.html 如果想在运行的Linux下访问其它文件系统中的资源的话,就要用 ...
- 封装构造函数,用canvas写饼状图和柱状图
封装构造函数,用canvas写饼状图和柱状图 封装函数 // 场景 function XDLScence( options ) { this.stage = options.stage; //执行场景 ...
- scrapy再学习与第二个实例
这周对于Scrapy进一步学习,知识比较零散,需要爬取的网站因为封禁策略账号还被封了/(ㄒoㄒ)/~~ 一.信息存储 1.log存储命令:scrapy crawl Test --logfile=tes ...
- Codeforces 877C Slava and tanks(思维)
题目链接:http://codeforces.com/problemset 题目大意:有n个格子,某些格子里可能有一个或多个坦克,但不知道具体位置,每个坦克被轰炸一次就会移动到相邻的格子里(第1个格子 ...