【计算几何】点在多边形内部

问题描述:已知点P(x,y)和多边形Poly,判断点P(x,y)是否在多边形内部。

基本方法:射线法

以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外部,考虑沿着L从无究远处开始自左向右移动。

遇到和多边形的第一个交点的时候,进入到了多边形的内部,遇到第二个交点的时候,离开了多边形...

因而当L和多边形的交点数目C是奇数的时候,P在多边形内,是偶数,则P在多边形外。

特殊情况分析,如图下图(a),(b),(c),(d)所示。

图(a)中,L和多边形的顶点相交,交点只能计算一个。

图(b)中,L和多边形顶点的交点不应被计算。

图(c)和(d)中,L和多边形的一条边重合,这条边应该被忽略不计。

代码实现如下:

 1 typedef struct Point
 2 {
 3     int x;
 4     int y;
 5 }Point;
 6 //  The function will return YES if the point x,y is inside the polygon, or
 7 //  NO if it is not.  If the point is exactly on the edge of the polygon,
 8 //  then the function may return YES or NO.
 9 bool IsPointInPolygon(std::vector<Point> poly,Point pt)
10 {
11     int i,j;
12     bool c = false;
13     for (i = 0,j = poly.size() - 1;i < poly.size();j = i++)
14     {
15         if ((((poly[i].y <= pt.y) && (pt.y < poly[j].y)) ||
16             ((poly[j].y <= pt.y) && (pt.y < poly[i].y)))
17             && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y)/(poly[j].y - poly[i].y) + poly[i].x))
18         {
19             c = !c;
20         }
21     }
22     return c;
23 }

代码分析:

条件1:((ploy[i].y <= pt.y) && (pt.y < poly[j].y)) || ((ploy[j].y <= pt.y) && (pt.y < poly[i].y))

由于判断过程主要是判断,射线L与多边形每条边是否存在交点,而射线L平行于X轴,因此条件1相当于判断点P在Pi和Pj在垂直距离之间。

条件2: (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y)/(poly[j].y - poly[i].y) + poly[i].x)

条件2可转换成:(pt.x - poly[i].x) * (poly[j].y - poly[i].y) - (poly[j].x - poly[i].x) * (pt.y - poly[i].y) < 0,相当于向量PiP和向量PiPj的叉积。

当向量PiP和向量PiPj的叉积小于0时,向量PiP在向量PiPj的逆时针方向,相当于向量PiP在向量PiPj的右侧,而射线L由左侧射出,而且点P在Pi和Pj在垂直距离之间,因此,射线L和PiPj的跨立条件成立,相交。

参考资料:

http://alienryderflex.com/polygon/

时间: 2024-11-10 11:02:30

【计算几何】点在多边形内部的相关文章

判断点是否在多边形内部

转自阿凡卢原文 判断点是否在多边形内部 如何判断一个点是否在多边形内部? (1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部. (2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部. (3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目.如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部. 具体做法:将测试点的Y坐标与多边形的每一个点进行比较,会得到一个测试点所在的行与多边形边的

GMAP 判断一个坐标点是否在不规则多边形内部的算法

在gmap(地理信息管理系统)中,判断一个坐标是否在多边形内部是个经常要遇到的问题.乍听起来还挺复杂.根据W. Randolph Franklin 提出的PNPoly算法,只需区区几行代码就解决了这个问题. 假设多边形的坐标存放在一个数组里,首先我们需要取得该数组在横坐标和纵坐标的最大值和最小值,根据这四个点算出一个四边型,首先判断目标坐标点是否在这个四边型之内,如果在这个四边型之外,那可以跳过后面较为复杂的计算,直接返回false. if (p.x < minX || p.x > maxX

HDU 1756 Cupid&#39;s Arrow (几何问题,判定点在多边形内部)

题意:中文的么,自己看喽. 析:很容易明白是判定点是不是在多边形内部,一般是向量来判定,我一开始用点在向量的右侧,因为是顺时针给的,只要点全在外侧或边上, 就可以,暴力一下就ok.由于这个是浮点数,一定要注意精度,也就是误差,结果WA了好几次,一气之下,我改了算法,采用转角法, 假想有一条向右的射线,统计多边形穿过这条射线正反多少次,顺时针减1,逆时针加1.一定要注意这个精度控制,不然就WA. 代码如下: #include <iostream> #include <cstdio>

hlg1306再遇攻击--射线法判断点是否在多边形内部

再遇攻击 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 313(40 users) Total Accepted: 91(32 users) Rating:  Special Judge: No Description Dota中英雄技能攻击会有一个范围,现在释放一个技能给出他的攻击范围和目标英雄的位置,问是否能攻击到.攻击范围保证是一个多边型. Input 有多组测试数据 第一行输入1个整数n, 期中n代表攻击范围是给出的n个点

百度地图判断点是否在不规则多边形内部

在线查看 demo:https://pan.baidu.com/s/1jI7Ytuu 判断点是否在不规则多边形内部的判断逻辑: 1:在地图上绘制的图形必须是多边形,具体绘制可参考之前博文:http://www.cnblogs.com/mrzhu/p/7966311.html 2:矩形排除 取多边形分别在XY轴上的最大最小值,组成一个矩形,判断这个点是否在这个矩形内部,如果不在 则不需要继续向下判断 3:边线排除 判断点是否在多边形的某条边上,如果在 则不需要继续向下判断 4:以点到y轴的距离得到

判断一个坐标是否在多边形内部

在GIS(地理信息管理系统)中,判断一个坐标是否在多边形内部是个经常要遇到的问题.乍听起来还挺复杂.根据W. Randolph Franklin 提出的PNPoly算法,只需区区几行代码就解决了这个问题. 假设多边形的坐标存放在一个数组里,首先我们需要取得该数组在横坐标和纵坐标的最大值和最小值,根据这四个点算出一个四边型,首先判断目标坐标点是否在这个四边型之内,如果在这个四边型之外,那可以跳过后面较为复杂的计算,直接返回false. if (p.x < minX || p.x > maxX |

判断点在多边形内部

项目的需要,需要判断点在多边形的内部,是整个算法必要的步骤,查了一些资料,中文很少,英文资料已经介绍的很清楚了,这里只是总结一下. 问题的完整描述是判断平面上一点在多边形的内部.外部或者边界上. 有两种解决方法:光线投射算法,环绕数法. 光线投射算法: 一个简单的判断方法是从该点想任意固定方向发送射线,求射线于多边形边的交点的个数.如果交点的个数是偶数个,则该点在多边形的外部,如果是交点的个数是奇数,则该点在多边形的外部.这种方法不能判断在多边形上的情况. 要注意两个问题: 第一个是当要判断的点

POJ 1265-Area(计算几何+皮克定理+多边形面积公式)

题目地址:POJ 1265 题意:给定一个格点多边形,求出内部点数in,边上点数on,和面积S. 思路:运用的定理很多. 1.皮克定理:S=in+on/2-1,即in=(2*S+2-on)/2. 2.多边形的面积公式:按顺序求相邻两个点与原点组成的向量的叉积之和. 3.求边上的格点数:以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其中,dxdy分别为线段横向占的点数和纵向占的点数.如果dx或dy为0,则覆盖的点数为dy或dx. #include <stdio.h> #includ

计算几何-点与多边形的位置判断-zoj1081Points Within

This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://www.cnblogs.com/JasonCow/ 叉积判方向 点积判角度 角度和=0°在外面 否则在里面 AC Code 这么短的计算几何,君难道不想收入囊中吗? 1 #include <algorithm> 2 #include <iostream> 3 #include <cs