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

(1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。

(2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。

(3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。

具体做法:将测试点的Y坐标与多边形的每一个点进行比较,会得到一个测试点所在的行与多边形边的交点的列表。在下图的这个例子中有8条边与测试点所在的行相交,而有6条边没有相交。如果测试点的两边点的个数都是奇数个则该测试点在多边形内,否则在多边形外。在这个例子中测试点的左边有5个交点,右边有三个交点,它们都是奇数,所以点在多边形内。

算法图解:

关于这个算法的具体的更多图形例子:http://alienryderflex.com/polygon/

参考代码:

Codeint pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{int i, j, c = 0;for (i = 0, j = nvert-1; i < nvert; j = i++) {if ( ((verty[i]>testy) != (verty[j]>testy)) &&(testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )c = !c;}return c;
}

来自一个polygon的内部实现:

Codepublic bool IsInside(PointLatLng p){int count = Points.Count;if(count < 3){return false;}bool result = false;for(int i = 0, j = count - 1; i < count; i++){var p1 = Points[i];var p2 = Points[j];if(p1.Lat < p.Lat && p2.Lat >= p.Lat || p2.Lat < p.Lat && p1.Lat >= p.Lat){if(p1.Lng + (p.Lat - p1.Lat) / (p2.Lat - p1.Lat) * (p2.Lng - p1.Lng) < p.Lng){result = !result;}}j = i;}return result;}

特殊情况:要检测的点在多变形的一条边上,射线法判断的结果是不确定的,需要特殊处理(If the test point is on the border of the polygon, this algorithm will deliver unpredictable results)。

计算一个多边形的面积(area of a polygon):

Codeprivate static double SignedPolygonArea(List<PointLatLng> points){// Add the first point to the end.int pointsCount = points.Count;PointLatLng[] pts = new PointLatLng[pointsCount + 1];points.CopyTo(pts, 0);pts[pointsCount] = points[0];for (int i = 0; i < pointsCount + 1; ++i){pts[i].Lat = pts[i].Lat * (System.Math.PI * 6378137 / 180);pts[i].Lng = pts[i].Lng * (System.Math.PI * 6378137 / 180);}// Get the areas.double area = 0;for (int i = 0; i < pointsCount; i++){area += (pts[i + 1].Lat - pts[i].Lat) * (pts[i + 1].Lng + pts[i].Lng) / 2;}// Return the result.return area;}/// <summary>/// Get the area of a polygon/// </summary>/// <param name="points"></param>/// <returns></returns>public static double GetPolygonArea(List<PointLatLng> points){// Return the absolute value of the signed area.// The signed area is negative if the polygon is oriented clockwise.return Math.Abs(SignedPolygonArea(points));}

参考资料:

http://alienryderflex.com/polygon/

http://en.wikipedia.org/wiki/Point_in_polygon

http://www.codeproject.com/Tips/84226/Is-a-Point-inside-a-Polygon

判断点是否在多边形内部相关推荐

  1. 向量叉乘判断点是否在多边形内部

    向量叉乘: 二维向量的叉乘 ( x1 , y1 ) * ( x2 , y2 ) = x1y2 - y1x2 如果值大于0 , 则表明 ( x2 , y2 ) 在 ( x1 , y1 )左边,反之在右边 ...

  2. 【计算几何】向量叉积和凸包 | 引射线法 | 判断点是否在多边形内部 | 葛立恒扫描法 | Cross Product and Convex Hul

     猛戳!跟哥们一起玩蛇啊 

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

    一.比如说,我就随便涂了一个多边形和一个点,现在我要给出一种通用的方法来判断这个点是不是在多边形内部(别告诉我用肉眼观察--). 首先想到的一个解法是从这个点做一条射线,计算它跟多边形边界的交点个数, ...

  4. PHP 判断点是否在多边形内

    如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...

  5. 如何判断一个点在多边形内

    一.从三角形开始说起---怎么判断一个点在三角形内 三角形是最简单的多边形了.先说说三角形有哪些判断方法. 参考自:判断一个点是否在三角形内部 - 知乎 几种方法判断平面点在三角形内_独L无二的博客- ...

  6. [转]如何判断一个点是否在一个多边形内部

    原文地址:http://hi.baidu.com/wayright/item/ad18e4c0c5446b2dee4665c9 在多边性的存储中,每一个多边形都是由一系列连续的点组成,例如保存为数组P ...

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

    参考:https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html 在GIS(地理信息管理系统)中,判断一个坐标是否在多边形内部是个经常要遇到的 ...

  8. 七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断

    注:此时我已经完成了一个演示版本,但是为了文章的渐进性,我将把开发过程一步步的写出来,用来记录. 本实验代码用到的图形学关系和算法列举如下: 基本计算机图形学关系和算法 1.点在多边形内部的 点在多边 ...

  9. JAVA使用JTS 判断坐标点是否在坐标多边形内部

    JAVA使用JTS 判断坐标点是否在坐标多边形内部 思路 Geometry之间的关系 API及参考博客 代码 依赖 工具类 测试类 思路 判断坐标点是否在坐标多边形内部,首先不能直接计算坐标点,是需要 ...

最新文章

  1. 像教光学一样在高中教深度学习?怼过LeCun的Google大牛认为这事有出路
  2. vue小项目总结与笔记【六】——使用axios发送ajax请求
  3. 在ubuntu 下 利用svn命令导出 两个版本之间更改的文件
  4. GAE上使用Struts2
  5. apache rewrite 支持post 数据
  6. 1.16 static关键字(静态变量和静态方法)
  7. DOM结点的渲染(attach)
  8. IOS项目集成Weex
  9. 前端学习(1883)vue之电商管理系统电商系统之每次只能打开一个菜单项并解决边框问题
  10. Android 系统性能优化(25)---Dalvik 与ART
  11. UI设计素材|卡券界面设计
  12. C# Struct的内存布局
  13. leetcode python3 简单题100. Same Tree
  14. Unity3D ----- 制作信息滚动提示(NGUI)
  15. 【高频电子线路】[模型]阻抗变换与阻抗匹配(第2章 谐振功率放大器)
  16. 加拿大布兰登大学计算机专业,加拿大布兰登大学有哪些专业?
  17. docker设置系统开机自动启动,docker容器随着docker服务启动自动运行
  18. 手机:运行内存,机身内存,内存卡的区分
  19. linux non-iso extended-ascii,Linux 下文件Non-ISO extended-ASCII编码问题
  20. ssh免密码登录配置方法,(图示加命令)

热门文章

  1. Intel彻底封杀Skylake非黑盒版超频
  2. SQL Server补丁版本的检查
  3. 这个路由器漏洞已存在12年,可影响全球数百万台设备引发供应链攻击
  4. m_Orchestrate learning system---二十九、什么情况下用数据库做配置字段,什么情况下用配置文件做配置...
  5. 深度学习与人工智能革命:part IV
  6. 百度地图开发实例文章(一)
  7. Linux使用ntpdate和ntpd进行时间同步
  8. php dirname(_FILE_)
  9. vue入门学习(基础篇)
  10. 百度云文章的链接地址抓取工具