HDU-1756 Cupid's Arrow 判断点是否在多边形内部

HDU 1756 Cupid's Arrow(计算几何---判断点是不是在多边形内) 原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=1756 模板题 #include <bits/stdc++.h> #define eps 1e-8 #define INF 0x3f3f3f3f #define PI acos(-1) #define lson l,mid,rt<< 阅读详情

        题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1756

        判断点是否在多边形内部

       从点p做一条射线,看射线和多边形的交点有几个,奇数个为相交,偶数个不相交。。。

       具体做法如下:

            以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外,考虑沿着L从无穷远处开始自左向右移动,遇到和多边形的第一个交点的时候,进入到了多边形的内部,遇到第二个交点的时候,离开了多边形,……所以很容易看出当L和多边形的交点数目C是奇数的时候,P在多边形内,是偶数的话P在多边形外。
           但是有些特殊情况要加以考虑。如图下图(a)(b)(c)(d)所示。在图(a)中,L和多边形的顶点相交,这时候交点只能计算一个;在图(b)中,L和多边形顶点的交点不应被计算;在图(c)和(d) 中,L和多边形的一条边重合,这条边应该被忽略不计。如果L和多边形的一条边重合,这条边应该被忽略不计。

                                                           

        为了统一起见,我们在计算射线L和多边形的交点的时候,1。对于多边形的水平边不作考虑;2。对于多边形的顶点和L相交的情况,如果该顶点是其所属的边上纵坐标较大的顶点,则计数,否则忽略;3。对于P在多边形边上的情形,直接可判断P属于多边行。由此得出算法的伪代码如下:
    count ← 0;
    以P为端点,作从右向左的射线L; 
    for 多边形的每条边s
         do if P在边s上 
                then return true;
         if s不是水平的
                 then if s的一个端点在L上
                        if 该端点是s两端点中纵坐标较大的端点
                               then count ← count+1
                else if s和L相交
                       then count ← count+1;
       if count mod 2 = 1 
             then return true;
      else return false;
  其中做射线L的方法是:设P'的纵坐标和P相同,横坐标为正无穷大(很大的一个正数),则P和P'就确定了射线L。
  判断点是否在多边形中的这个算法的时间复杂度为O(n)。
  另外还有一种算法是用带符号的三角形面积之和与多边形面积进行比较,这种算法由于使用浮点数运算所以会带来一定误差,不推荐大家使用。


   My code:

//STATUS:C++_AC_15MS_244KB  
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include<queue>
#include<math.h>
#include<map>
#include<set>
using namespace std;
#define LL __int64
#define pii pair<int,int>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int MAX=110,INF=200000000;
const double esp=1e-6;
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
struct Line{
	int x1,y1,x2,y2;
};
struct Node{
	int x,y;
}nod[MAX];
int chaji(Node &a,Node &b){
	return a.x*b.y-b.x*a.y;
}
int quick(Node &l1,Node &l2,Node &r1,Node &r2);
int las(Node &l1,Node &l2,Node &r1,Node &r2);
int ponls(Node &a,Node &b,Node &p);
int pinply(int num_node,Node nod[],Node &p);
int n,m;
int main()
{
//	freopen("in.txt","r",stdin);
	int i;
	Node p;
	while(~scanf("%d",&n))
	{
		for(i=0;i<n;i++)
			scanf("%d%d",&nod[i].x,&nod[i].y);
		scanf("%d",&m);
		while(m--){
			scanf("%d%d",&p.x,&p.y);
			if(pinply(n,nod,p))
				printf("Yes\n");
			else printf("No\n");
		}
	}
	return 0;
}

int pinply(int num_node,Node nod[],Node &p)
{
	int i,j,cou=0;
	Node ray;
	ray.x=-1,ray.y=p.y;
	for(i=0;i<num_node;i++){
		j=(i+1)%num_node;
		if(ponls(nod[i],nod[j],p))return 0;
		if(nod[i].y!=nod[j].y){
			if(ponls(p,ray,nod[i]) && nod[i].y==max(nod[i].y,nod[j].y))
				cou++;
			else if(ponls(p,ray,nod[j]) && nod[j].y==max(nod[i].y,nod[j].y))
				cou++;
			else if(quick(nod[i],nod[j],p,ray) && las(nod[i],nod[j],p,ray)
				&& las(p,ray,nod[i],nod[j]))
				cou++;
		}
	}
	return cou&1;
}

int ponls(Node &a,Node &b,Node &p)
{
	if( (p.x==a.x && p.y==a.y) || (p.x==b.x && p.y==b.y) )return 2;
	Node r1,r2;
	r1.x=a.x-b.x,r1.y=a.y-b.y;
	r2.x=p.x-b.x,r2.y=p.y-b.y;
	if(!chaji(r1,r2) && p.x>=min(a.x,b.x) && p.x<=max(a.x,b.x) 
		&& p.y>=min(a.y,b.y) && p.y<=max(a.y,b.y))
		return 1;
	return 0;
}

int quick(Node &l1,Node &l2,Node &r1,Node &r2)
{

	if(min(l1.x,l2.x)>max(r1.x,r2.x)
		|| min(l1.y,l2.y)>max(r1.y,r2.y)
		|| max(l1.x,l2.x)<min(r1.x,r2.x)
		|| max(l1.y,l2.y)<min(r1.y,r2.y))
		return 0;
	return 1;
}

int las(Node &l1,Node &l2,Node &r1,Node &r2)
{
	Node a,b,c;
	a.x=l1.x-r1.x;
	a.y=l1.y-r1.y;
	b.x=r2.x-r1.x;
	b.y=r2.y-r1.y;
	c.x=l2.x-r1.x;
	c.y=l2.y-r1.y;
	if( ((a.x*b.y)-(b.x*a.y))*((c.x*b.y)-(b.x*c.y))<0)return 1;
	else return 0;
}

Cadence Allegro 17.4学习记录开始02-原理图Capture CIS 17.4 Allegro的第一方网表与第三方网表有以下几个区别点;Ø 与Allegro实现交互式操作的是第一方网表,第三方网表时不可以实现交互式操作;Ø 第三方网表不能将器件的Value属性导入到PCB中,输出时以封装属性来代替Value属性,第一方网表是可以的;Ø 网表导入到PCB中时,第三方的网表需要指定事先指定好PCB封装库文件,并产生Device文件,才可以将网表导入到PCB中,第一方网表则可以直接导入。 阅读详情

相关推荐

Autosar结合simulink的汽车应用层软件开发实例

本文基于汽车应用开发案例,并结合Autosar相关知识,生成具有Autosar标准的汽车应用层开发代码,以供学习和参考。以上就是本篇内容,主要是利用Simulink创建Autosar接口并进行端口映射的方法。

m0_64899535的博客 2153

HDU1756:Cupid's Arrow

射线法判点是否在多边形内

AbZoey's Blog 573

AutoCAD2016安装破解教程

AutoCAD2016安装破解教程。本人亲自实验,破解成功,有效。以64位为例。 工具/原料   笔记本电脑 AutoCAD2016安装包 AutoCAD2016注册机(xf-adsk2016_x64.exe)链接:http://pan.baidu.com/s/1cAZQA windows7/8/8.1/10-32...

weixin_33804990的博客 1万+

[HDU1756]Cupid's Arrow

题目大意:   给你一个简单多边形和若干个点,问每个点在多边形内还是外。 思路:   一开始没看清楚题,写了一个叉积法,事实上叉积法只能用来处理凸多边形与点的关系。   考虑一个射线法。   从这个点水平往左作一条射线,如果与多边形相交次数为偶数,则在多边形外,否则在多边形内。   考虑一些特殊情况:     1.射线与多边形某条边重合,不算。     2.射线经过某个顶点...

weixin_34101229的博客 154

COMSOL实现裂缝性储层油水两相流模拟的关键技术

多孔介质中的流体流动模拟是油气藏开发的核心技术,其基本原理基于达西定律和质量守恒方程。在裂缝性储层中,离散裂缝网络与基质系统的耦合流动带来了特殊的数值挑战。通过COMSOL Multiphysics平台实现的多物理场耦合技术,可以精确模拟油水两相在复杂裂缝系统中的渗流行为。该技术采用Level Set方法表征裂缝几何形态,结合自适应网格生成技术解决狭窄裂缝的网格剖分难题,并创新性地引入Bang-Larsen毛管压力滞后模型,显著提高了采收率预测精度。这些方法在致密油藏开发、水驱优化等工程实践中具有重要应用价

weixin_34005090的博客 229

如何解决Elsevier和IEEE期刊之间参考文献的转换问题

Elsevier期刊和IEEE旗下的期刊两者模版互相转换的时候,会发现Elsevier模版的参考文献是存放在.bib文件下的,然后在.tex文件中直接引用即可。3. 在IEEE的.tex文件中的\end{document}命令行之前,添加下面的这句话(ps:\bibliography{**}中的**名称即为.bib文件的名称)如何将Elsevier的参考文献快速的转成IEEE期刊可用的格式,是本博客需要解决的问题。2. 将下载好的.bib文件,上传到IEEE的latex文件中。

薰珞婷紫小亭子的博客 1675

[ACM] hdu Cupid's Arrow (判断点是否在多边形内)

Cupid's Arrow Time Limit : 3000/1000ms (Java/Other)Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 3Accepted Submission(s) : 2 Font: Times New Roman | Verdana | Georgia ...

weixin_34111790的博客 265

YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析

全网最全YOLOv5项目目录结构超详细分析。逐个文件注释,小白上手必备

路人贾的博客 9万+

ACM-计算几何之Cupid's Arrow——hdu1756

ACM 计算几何 Cupid's Arrow hdu1756 点在多边形内 射线法 射线法详解

继续激情,继续奋斗。 3189

数学建模学习(75):全局敏感性分析Morris 方法

敏感性分析 (SA) 是分析不同应用条件下模型行为的基本实践。提出了许多 SA 技术,从简单的筛选方法到计算成本高昂的基于方差的方法。本篇内容我们通过将 Morris 方法来对模型进行分析。

全栈川川 1万+

ZYNQ系列PS侧和PL侧DDR3或DDR4在AD(Altium Designer 25)中的layout布线规则约束

DDR3或DDR4的PCB布线规则通常有相对固定的要求,对应的,在PCB设计时有固定的约束设置。

FPGA艺术家的博客 790

HDU 1756 Cupid's Arrow 判断点在多边形的内部

Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1163Accepted Submission(s): 425 Problem Description 传说世上有一支丘比特的箭,凡是被...

dizhuo0219的博客 205

GDB交叉编译与问题解决:从零到精通的深度指南

完成后,GDB会安装到/usr/local/gdb-aarch64/bin,可以用aarch64-linux-gnu-gdb --version检查。:得有支持目标架构的交叉编译工具链,比如gcc-arm-none-eabi(用于ARM裸机)或aarch64-linux-gnu-gcc(用于ARM Linux)。:在配置工具链时,运行aarch64-linux-gnu-gcc --version检查版本,确保工具链没问题。这种场景下用GDB调试,就像在荒野求生,但别慌,GDB依然是你的好伙伴。

大模型大数据攻城狮的专栏 1万+

HDU 1756 Cupid's Arrow(判断点是否在多边形内部)

Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 702    Accepted Submission(s): 252 Problem Description 传说世上有一支丘比特的箭,凡

sunrain的专栏 1300

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

HDU 1756 Cupid's Arrow(判定点在多边形内)

HDU 1756 Cupid's Arrow(判定点在多边形内) http://acm.hdu.edu.cn/showproblem.php?pid=1756 题意:        给你一个n个顶点的多边形,然后给你m个点的坐标,问你这m个点每个点是否在多边形内?(在边上也算) 分析:        对于简单多边形(边不自交)有两种方法可以判断,第一种是看该点与多边形每条边构成的三角形面

code 1262

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

hdu 1756 Cupid's Arrow(计算几何)

题目链接:hdu 1756 Cupid's Arrow 题意: 顺时针给你n个点,然后m个询问,问你给出的点是否在n个点构成的多边形的内部。 题解: 直接上模板。 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 #define MAXN 1007 4 #def...

weixin_30407099的博客 154

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

HDU 1756 点在多边形内 Cupid's Arrow

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1756 分析:[射线法]           从已知点向x+oo远处向一水平射线,判断射线与多边形的交点个数,           若为偶数,则点在多边形外,反之则在多边形内。           注意几种特殊情况:                  1、边和射线共线;

PWZER 1152

hdu 1756 Cupid's Arrow 点在多边形内部判定

题目地址:hdu1756

Jingqi@Mr.B的ACM博客 777

hdoj1756Cupid's Arrow【点在多边形内部的判断 射线法】

Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1309    Accepted Submission(s): 480 Problem Description 传说世上有一支丘比特的箭,

走一步再走一步 829

hdu 1756 Cupid's Arrow (计算几何,点是是否完全在多边形内)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1756 Cupid's Arrow Problem Description 传说世上有一支丘比特的箭,凡是被这支箭射到的人,就会深深的爱上射箭的人。 世上无数人都曾经梦想得到这支箭。Lele当然也不例外。不过他想,在得到这支箭前,他总得先学会射箭。 日子一天天地过,Lele的箭术也越来越强,渐...

Source_Roc 216

HDU 1756 Cupid's Arrow(判断点是否在多边形内模板)

http://acm.hdu.edu.cn/showproblem.php?pid=1756 方法:求解以某点为起点的射线与多边形边的交点个数,奇数时则点在内,偶数在外 需要特别注意交点在顶峰和谷底以及射线与边平行的情况 #include<stdio.h> #include<math.h> typedef struct node { ...

anccx84886的专栏 171

HDU 1756 Cupid's Arrow( 判断点在多边形的内外 )

链接:传送门 思路:判断每支箭是否在多边形内,计算几何点定位中水题,不清楚下面的代码能不能适用于给定点的顺序不确定( 既不是顺时针又不是逆时针 ) /************************************************************************* > File Name: hdu1756.cpp > Aut...

dijingzhou4259的博客 160

HDU1756 Cupid's Arrow平面几何

http://acm.hdu.edu.cn/showproblem.php?pid=1756   Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3177    Accepted Sub...

lanshan1111的博客 272

hdu 1756 Cupid's Arrow 计算几何

判断点是否在多边形内部     对于任意四边形,可以随机选取一条射线向外延伸,如果相交边数为奇数,则在内,偶数,则在外    这题无需考虑在边上的情况 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** 给定n个点

弱弱的jxy 972

【HDU】1756Cupid's Arrow(判断:点在多边形内 模板题目)

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3177    Accepted Submission(s): 1142   Problem Description 传说世上有一支丘比特的箭,凡是被这支箭射到的人...

红点雷龙XL 273

HDU 1756 Cupid's Arrow(判断点是否在任意多边形上且包括边)

就是模板题,注意在套模板的时候输入的数,要放在定义好的 Point{}内,参数分别是结构体Point定义的数组和元素。 #include #include #include #include #include #include #include #include #include #define L1 long long #define L2 __int64 #define inf 0x

Grit_ICPC的博客 612
上一篇: HDU-1394 Minimum Inversion Number 线段树|树状数组
下一篇: HDU-2795 Billboard 线段树|树状数组
angle555945
博客等级 码龄15年 66粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值