判断一个点是否在一个复杂多边形的内部

结论:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。利用此结论近些代码编写

 1   // 功能:判断点是否在多边形内
 2     // 方法:求解通过该点的水平线与多边形各边的交点
 3     // 结论:单边交点为奇数,成立!
 4
 5     // 参数:
 6     // POINT p 指定的某个点
 7     // LPPOINT ptPolygon 多边形的各个顶点坐标(首末点可以不一致)
 8     // int nCount 多边形定点的个数
 9
10     public static bool PointInPolygon(Vector2 p, Vector2[] ptPolygon, int nCount)
11     {
12         int nCross = 0;
13
14         for (int i = 0; i < nCount; i++)
15         {
16             Vector2 p1 = ptPolygon[i];//当前节点
17             Vector2 p2 = ptPolygon[(i + 1) % nCount];//下一个节点
18
19             // 求解 y=p.y 与 p1p2 的交点
20
21             if (p1.y == p2.y) // p1p2 与 y=p0.y平行
22                 continue;
23
24             if (p.y < Mathf.Min(p1.y, p2.y)) // 交点在p1p2延长线上
25                 continue;
26             if (p.y >= Mathf.Max(p1.y, p2.y)) // 交点在p1p2延长线上
27                 continue;
28
29             // 从P发射一条水平射线 求交点的 X 坐标 ------原理: ((p2.y-p1.y)/(p2.x-p1.x))=((y-p1.y)/(x-p1.x))
30             //直线k值相等 交点y=p.y
31             double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;
32
33             if (x > p.x)
34                 nCross++; // 只统计单边交点
35         }
36
37         // 单边交点为偶数,点在多边形之外 ---
38         return (nCross % 2 == 1);
39     }
40
41 }

参考资料:  http://erich.realtimerendering.com/ptinpoly/

原文地址:https://www.cnblogs.com/grassgarden/p/9250946.html

时间: 2024-10-14 00:23:59

判断一个点是否在一个复杂多边形的内部的相关文章

点在多边形内算法,C#判断一个点是否在一个复杂多边形的内部

判断一点是否在不规则图像的内部算法,如下图是由一个个点组成的不规则图像,判断某一点是否在不规则矩形内部,先上效果图 算法实现如下,算法简单,亲试有效 public class PositionAlgorithmHelper { /// <summary> /// 判断当前位置是否在不规则形状里面 /// </summary> /// <param name="nvert">不规则形状的定点数</param> /// <param n

如何判断一个点是否在一个多边形内?

提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内. 一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的面积等于下面绝对值的二分之一: | x1  y1  1 | | x2 y2  1 | = x1y2 + x3y1 + x2y3 –x3y2 – x2y1 – x1y3 | x3 y3  1 | 当且仅当点P3位于直线P1P2(有向直线P1->P2)的右侧时,该表达式的符号为正.这个公式可以在固定的时

判断一个点是否在一个多边形里

“判断一个点是否在一个多边形里”,一开始以为是个挺难的问题,但Google了一下之后发现其实蛮简单,所用到的算法叫做“Ray-casting Algorithm”,中文应该叫“光线投射算法”,这是维基百科的描述:[维基百科] 简单地说可以这么判断:从这个点引出一根“射线”,与多边形的任意若干条边相交,累计相交的边的数目,如果是奇数,那么点就在多边形内,否则点就在多边形外. 如图,A点引一条射线,与多边形3条边相交,奇数,所以A点在多边形内,而从B点引一条射线,与多边形的2条边相交,偶数,所以B点

js 判断一个点是否在一个多边形之内

出处: https://github.com/substack/point-in-polygon/blob/master/index.js github: https://github.com/substack/point-in-polygon module.exports = function (point, vs) { // ray-casting algorithm based on // http://www.ecse.rpi.edu/Homepages/wrf/Research/Sho

python中如何不区分大小写的判断一个元素是否在一个列表中

python中判断某一个元素是否在一个列表中,可以使用关键字in 和 not in. 示例如下: 如果需要输出相应的信息,可以搭配使用if语句,这里不赘述. ------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------

判断一个数值是否在一个逗号分隔的字符串中

使用表达式方式: string s = "12,123,1234,32,321,345"; if (s.Split(',').Any(x => x == "12")) //存在 2. string a = "1,2,3,4,5,6"; if(a.IndexOf("3,")>-1) { //字符串A中包含字符串B } string a = "1,2,3,4,5,6"; List<string

JavaScript 中 如何判断一个元素是否在一个数组中

<script type="text/javascript"> var arrList=['12','qw','q','v','d','t']; console.log(arrList.indexOf('12')) >> 0 console.log(arrList.indexOf('d')) >> 4 console.log(arrList.indexOf('sdfds')) >> -1 </script> 利用indexOf

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

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

判断一个点是否在多边形内

#转载自:http://blog.csdn.net/u011722133/article/details/52813374 在GIS(地理信息管理系统)/PCL(点云库)中,判断一个坐标是否在多边形内部是个经常要遇到的问题.乍听起来还挺复杂.根据W. Randolph Franklin 提出的PNPoly算法,只需区区几行代码就解决了这个问题 假设多边形的坐标存放在一个数组里,首先我们需要取得该数组在横坐标和纵坐标的最大值和最小值,根据这四个点算出一个四边型,首先判断目标坐标点是否在这个四边型之