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

摘要:
如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。利用此结论近些代码编写1//功能:判断点是否在多边形内2//方法:求解通过该点的水平线与多边形各边的交点3//结论:单边交点为奇数,成立!

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

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

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

1   //功能:判断点是否在多边形内 
2     //方法:求解通过该点的水平线与多边形各边的交点 
3     //结论:单边交点为奇数,成立! 
4 
5     //参数: 
6     //POINT p 指定的某个点 
7     //LPPOINT ptPolygon 多边形的各个顶点坐标(首末点可以不一致) 
8     //int nCount 多边形定点的个数 
9 
10     public static bool PointInPolygon(Vector2 p, Vector2[] ptPolygon, intnCount)
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/

免责声明:文章转载自《判断一个点是否在一个复杂多边形的内部》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何调试没有源码的.Net程序vue指令(7)v-on下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

display:box,按比列划分,水平均分,及垂直等高

一、按比例划分 <div class="test"> <p id="p1">Hello</p> <p id="p2">W3School</p> </div> <style> .test{ display:-moz-box; display:-webkit-box; di...

JS判断图片是否加载完成三种方式

1.img的complete属性 轮询不断监测img的complete属性,如果为true则表明图片已经加载完毕,停止轮询。该属性所有浏览器都支持。 <p id="p1"></p> <img id="img1"src="../Images/1.jpg" /> <script> functioni...

JavaScript DOM元素常见操作详解【添加、删除、修改等】

本文实例讲述了JavaScript DOM元素常见操作。分享给大家供大家参考,具体如下: DOM概念 DOM(Document Object Model):文档对象模型。 通过开发者工具的Elements标签页可以查看 通过开发者工具的Sources标签页也可以观察到整个文档是有一系列节点 整个文档是由一系列节点对象组成的一棵树。 节点(Node)包括元素...

表格联动的实现

在Wyn Enterprise 同一个报表范围内,点击一个表格的某个单元,刷新另一个表格内的数据,这种钻取操作称为表格联动。下面以一个示例,介绍表格联动的实现方法。在此示例中,主表格显示产品类别,用户点击某个类别,另一个表格(子表格或从表格)显示该类别下的产品清单。下面的步骤假设已经创建好数据源,数据库结构是两个表,分别为【类别】和【产品】,两个表都有的【...