mongodb42 判断点位是否在多变形内 快速判断点是否在自交多边形内的方法
快速判断点是否在自交多边形内的方法
Amethodforthedecisionofapointwhetherinornotinself-intersectedpolygon 添加成功!
您可以在“我的服务”中查看您添加的引用通知列表,并且配置获取通知的方式。
关闭 下载PDF阅读器提出一种新方法,检测一个点是否在多边形和环内.此方法从检测点发出一条射线,根据边与射线的位置关系,定义了边相对于射线的位置函数,然后计算出所有边的位置函数之和,据此判断检测点是否在多边形和环内.该方法不仅能够检测简单多边形,还可用于检测自交多边形,并能同时检测多个多边形.实验结果表明,该方法简单,可靠,检测速度快.
作者:吴坚姜虹王小椿
作者单位:西安交通大学机械工程学院数控研究所,西安,710049
刊名:系统仿真学报ISTICSCIPKU
判断点是否在任意多边形内求答案
struct point //建立point结构体,浮点型成员 x y{double xdouble y}point p[200],A,B //建立point 数组,和两个point 对象 A Bint m,n,i //定义三个整型变量 m n i double min_x,min_y,max_x,max_y //定义四个浮点型变量,用于储存临时数据(如比较大小)double max(double,double) //声明取最大值函数double min(double,double) //声明去最小值函数double cross(point,point,point) //声明计算叉积函数bool In_squre() //声明计算点是否在多边形内的函数(布尔型)int main(void){while(cinampgtampgtn) //输入 n 代表多边形顶点个数 {
if(n==0) break //当 n==0 时退出循环 for(i=0iampltni ){cinampgtampgtp[i].xampgtampgtp[i].y}p[n].x=p[0].x
p[n].y=p[0].y
cinampgtampgtm //输入 m 代表测试点的数目 while(m--){cinampgtampgtA.xampgtampgtA.y //输入测试点的坐标 if(In_squre()==true) coutampltamplt"Yes"ampltampltendl //调用判断点是否在多边形内函数 else coutampltamplt"No"ampltampltendl}}return0}double max(double a,double b) //判断最大值函数{
return aampgtb?a:b}double min(double a,double b) //判断最小值函数{
return aampltb?a:b
怎样确定一个点是否在多边形内部?(vc)
两种办法,第一种,以这个点为顶点,与多边形顶点连线,所有线的夹角之和是360,就是在这个多边行内部了
第二种,以这个点为顶点,做任意一条射线,如果所交的边是奇数,就是内部,偶数就是外部,不过要是点在边上,你就自己多考虑 吧
这是计算机图形学典型算法,可以参考游戏编程的一些算法
如何判定一个点是否在多边形的内部及算法?
假设多边形的坐标存放在一个数组里,首先我们需要取得该数组在横坐标和纵坐标的最大值和最小值,根据这四个点算出一个四边型,首先判断目标坐标点是否在这个四边型之内,如果在这个四边型之外,那可以跳过后面较为复杂的计算,直接返回false。
if (p.x lt minX || p.x gt maxX || p.y lt minY || p.y gt maxY) {
// 这个测试都过不了。。。直接返回false;
接下来是核心算法部分:
int pnpoly (int nvert, float *vertx, float *verty, float testx, float testy) {nbspint i, j, c = 0nbspfor (i = 0, j = nvert-1 i lt nvert j = i ) {nbspif ( ( (verty[i]gttesty) != (verty[j]gttesty) ) ampamp
(testx lt (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) vertx[i]) )c = !cnbsp }return c}
首先,参数nvert 代表多边形有几个点。浮点数testx, testy代表待测试点的横坐标和纵坐标,*vertx,*verty分别指向储存多边形横纵坐标数组的首地址。
我们注意到,每次计算都涉及到相邻的两个点和待测试点,然后考虑两个问题:
1. 被测试点的纵坐标testy是否在本次循环所测试的两个相邻点纵坐标范围之内?即verty[i]lttesty lt verty[j]
或者verty[j] lttesty lt verty[i]
2. 待测点test是否在i,j两点之间的连线之下?看不懂后半短if statement的朋友请自行在纸上写下i,j两点间的斜率公式,要用到一点初中解析几何和不等式的知识范畴,对广大码农来说小菜一碟。
然后每次这两个条件同时满足的时候我们把返回的布尔量取反。
随便画个多边形,随便定一个点,然后通过这个点水平划一条线,先数数看这条横线和多边形的边相交几次,(或者说先排除那些不相交的边,第一个判断条件),然后再数这条横线穿越多边形的次数是否为奇数,如果是奇数,那么该点在多边形内,如果是偶数,则在多边形外。
如何判断一个点是否在多边形内部
在GIS(地理信息管理系统)中,判断一个坐标是否在多边形内部是个经常要遇到的问题。乍听起来还挺复杂。根据W. Randolph Franklin 提出的PNPoly算法,只需区区几行代码就解决了这个问题。