[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 ...
随机推荐
- hdu 2545 树上战争(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2545 树上战争 Time Limit: 10000/4000 MS (Java/Others) ...
- eureka服务端
服务注册与发现——Eureka Eureka Server:服务的注册中心,负责维护注册的服务列表. Service Provider:服务提供方,作为一个Eureka Client,向Eureka ...
- linux下守护进程的创建
最近在学习linux c编程 看到了守护进程的创建,感觉很好玩, 测试环境ubuntu 15.04 下面贴出测试代码 #include <stdio.h> #include <std ...
- Tornado 目录
第一章:引言 1.1 Tornado是什么? 1.1.1 Tornado入门 1.1.2 社区和支持 1.2 简单的Web服务 1.2.1 Hello Tornado 1.2.1.1 参数handle ...
- mysql主从复制、操作语句
授权 grant replication slave on *.* to slave@192.168.10.64 identified by "123456" 登录测试 mysql ...
- rdpClient
https://github.com/jean343/RPI-GPU-rdpClient https://github.com/Nullstr1ng/MultiRDPClient.NET https: ...
- HIbernate学习笔记3 之 缓存和 对象的三种状态
一.hibernate一级缓存 * hibernate创建每个Session对象时,都会给该Session分配一块独立的缓冲区,用于存放Session查询出来的对象,这个分配给session的缓存区 ...
- MySQL中的内连接、外连接、交叉连接
内连接(INNER JOIN): 分为三种 等值连接.自然连接.不等连接 外连接(OUTER JOIN): 左外连接(LEFT OUTER JOIN或LEFT JOIN) 右 ...
- 181. Employees Earning More Than Their Managers
The Employee table holds all employees including their managers. Every employee has an Id, and there ...
- 二分查找(BinarySearch)
http://blog.csdn.net/magicharvey/article/details/10282801 简单描述 二分查找,又名折半查找,是一种在有序序列中查找特定元素的搜索算法.搜素过程 ...