判断一个点是否在多边形的内部(包括边)
传说世上有一支丘比特的箭,凡是被这支箭射到的人,就会深深的爱上射箭的人。
世上无数人都曾经梦想得到这支箭。Lele当然也不例外。不过他想,在得到这支箭前,他总得先学会射箭。
日子一天天地过,Lele的箭术也越来越强,渐渐得,他不再满足于去射那圆形的靶子,他开始设计各种各样多边形的靶子。
不过,这样又出现了新的问题,由于长时间地练习射箭,Lele的视力已经高度近视,他现在甚至无法判断他的箭射到了靶子没有。所以他现在只能求助于聪明的Acmers,你能帮帮他嘛?
Input
本题目包含多组测试,请处理到文件结束。
在每组测试的第一行,包含一个正整数N(2<N<100),表示靶子的顶点数。
接着N行按顺时针方向给出这N个顶点的x和y坐标(0<x,y<1000)。
然后有一个正整数M,表示Lele射的箭的数目。
接下来M行分别给出Lele射的这些箭的X,Y坐标(0<X,Y<1000)。
Output
对于每枝箭,如果Lele射中了靶子,就在一行里面输出"Yes",否则输出"No"。
Sample Input
4
10 10
20 10
20 5
10 5
2
15 8
25 8
Sample Output
Yes
No
代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>#define N 105
#define eps 1e-9
#define pi acos(-1.0)
#define P system("pause")
using namespace std;
struct point
{double x,y; point(double a,double b){x=a;y=b;}point (){};
}p[N],A;
int n;
point operator - (point A,point B)
{return point(A.x-B.x,A.y-B.y);
}
double dot(point A,point B)//点积
{return A.x*B.x+A.y*B.y;
}
double cross(point A,point B)//叉积
{return A.x*B.y-A.y*B.x;
}
int dcmp(double x)//判断实数是否大于0,避免浮点误差
{if(fabs(x)<eps) return 0;if(x<0) return -1;return 1;
}
int isonsegment(point a1,point a2)//判断点是否在线段上
{if((a2.x==A.x&&a2.y==A.y)||(a1.x==A.x&&A.y==a1.y)) return 1; return dcmp(cross(a1-A,a2-A))==0&&dcmp(dot(a1-A,a2-A))<0;
}
int isonpoly()//判断点是否在多边形内
{int i,wn=0;for(i=0;i<n;i++){ if(isonsegment(p[i],p[(i+n)%n]))return 1;int k=dcmp(cross(p[(i+1)%n]-p[i],A-p[i]));int d1=dcmp(p[i].y-A.y);int d2=dcmp(p[(i+1)%n].y-A.y);if(k>0&&d1<=0&&d2>0) wn++;if(k<0&&d2<=0&&d1>0) wn--; } if(wn!=0) return 1;return 0;
}int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);int m;while(scanf("%d",&n)!=EOF){int i; for(i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);scanf("%d",&m);while(m--) {scanf("%lf%lf",&A.x,&A.y);if(isonpoly())printf("Yes\n");else printf("No\n"); } } // P; return 0;
}
判断一个点是否在多边形的内部(包括边)相关推荐
- java pnpoly算法_PNPoly算法代码例子,判断一个点是否在多边形里面
写C语言的实验用到的一个算法,判断一个点是否在多边形的内部.C的代码如下: int pnpoly(int nvert, float *vertx, float *verty, float testx, ...
- [转]如何判断一个点是否在一个多边形内部
原文地址:http://hi.baidu.com/wayright/item/ad18e4c0c5446b2dee4665c9 在多边性的存储中,每一个多边形都是由一系列连续的点组成,例如保存为数组P ...
- 如何判断一个点是否在多边形内?(转)
转自:https://blog.csdn.net/u011722133/article/details/52813374 在GIS(地理信息管理系统)中,判断一个坐标是否在多边形内部是个经常要遇到的问 ...
- HDU1756(判断一个点是否在多边形内)
以下内容是在自己学习中总结出来了的,如果有什么错误,请指出,谢谢! 判断一个点是否在多边形内: (1)判断方法一(具有一定的局限性):将测试点的Y坐标与多边形的每一个点进行比较,将得到一 个与多边形的 ...
- JAVA判断一个地理坐标是否在一个多边形区域内和是否在一个圆形区域内(经纬度)
怎么样判断一个坐标点在一个多边形区域内?包括规则多边形,不规则多边形,还有圆... 1 判断一个坐标是否在圆形区域内? 多边形和圆分开写,首先简单的就是判断是否在圆里面,如何判断一个坐标是否在圆形区域 ...
- 判断一个点是否在多边形内部
一.比如说,我就随便涂了一个多边形和一个点,现在我要给出一种通用的方法来判断这个点是不是在多边形内部(别告诉我用肉眼观察--). 首先想到的一个解法是从这个点做一条射线,计算它跟多边形边界的交点个数, ...
- [math]判断一个点是否在多边形内的方法
文章目录 向量叉乘判别法 面积和判别法 夹角和判别法 引射线法 PNPoly算法 多边形的内角是由两条相邻边形成边界之内的角:如果一个多边形的所有内角均小于180°,则该多边形为凸(convex)多边 ...
- 6-1 判断一个点是否在一个圆的内部 (20 分)
创建一个表示点的类Point,运用组合的方式创建圆形类. 圆形有个成员函数isPointIn用于判断一个点是否在该圆形的内部. 完成对应类代码,使得主函数可以正确运行. 注意类的数值型数据成员类型为浮 ...
- 如何判断一个点是否在一个多边形内?
提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内. 一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的 ...
最新文章
- 7月23日 R进行层次聚类算法的继续完善
- Linux -- gpasswd
- 数据竞赛:如何小号作弊
- eclipse设置文档注释的格式
- 新方法-根据上排给出十个数,在其下排填出对应的十个数
- C 语言中,x += 5 == 4 是什么意思?
- PHP通过字符串调用函数
- 【转】测试用例设计——WEB通用测试用例
- java 设计模式学习笔记四 prototype模式
- matlab 半方差分析,地统计学半方差分析几个名词含义说明
- 你真的了解什么是项目管理吗?
- 最新C语言编程软件推荐(2021整理)
- 计算机机械硬盘容量怎么看,win10系统硬盘容量怎么看?一招查看win10硬盘容量的方法...
- 英语面试自我介绍范文(二)
- UI设计初学者教程:色彩基础知识
- 「GoTeam 招聘时间」滴滴出行系统研发工程师(北京)
- 关于驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server的解决方案
- Tyrion 中文文档(含示例源码)
- turtle画樱花树林
- php无限循环分类,php实现无限分类功能
热门文章
- 南农853计算机专业基础综合包括哪些,2017南京农业大学 南农大 853 计划机专业基础综合硕士招生考试大纲及参考书目.pdf...
- 刷卡分期的套路有多深?信用卡、花呗、白条没有善人
- 历年CSP-J(NOIP普及组)分类汇总目录
- Excel线性回归分析(高尔顿数据集;Anscombe四重奏数据集)
- Termux 速成指南
- Vue Cannot read property ‘xxx‘ of undefined
- Js中调用调用打印和自动生成条形码
- 系统性能优化的十大策略(强烈推荐,建议收藏)
- STM32G4 蓝桥杯嵌入式 IIC AT24C02储存器
- 反垃圾邮件系统|基于Springboot+vue 实现反垃圾邮件系统