引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法
时间复杂度:O(n) 适用范围:任意多边形
个人认为是非常不错的算法(不需考虑精度误差和多边形点给出的顺序),可以作为第一选择。

算法思想:
以被测点Q为端点,向任意方向作射线(一般水平向右作射线),统计该射线与多边形的交点数。如果为奇数,Q在多边形内;如果为偶数,Q在多边形外。计数的时候会有一些特殊情况,如图

Java实现

/*** 判断一点是否在多边形内** @param target* @param points* @return*/public static boolean isPointInPolygon(LatLonPoint target, LatLonPoint[] points) {int iSum, iCount, iIndex;double dLon1 = 0, dLon2 = 0, dLat1 = 0, dLat2 = 0, dLon;if (points.length < 3) {return false;}iSum = 0;iCount = points.length;for (iIndex = 0; iIndex<iCount;iIndex++) {if (iIndex == iCount - 1) {dLon1 = points[iIndex].getLongitude();dLat1 = points[iIndex].getLatitude();dLon2 = points[0].getLongitude();dLat2 = points[0].getLatitude();} else {dLon1 = points[iIndex].getLongitude();dLat1 = points[iIndex].getLatitude();dLon2 = points[iIndex + 1].getLongitude();dLat2 = points[iIndex + 1].getLatitude();}double ALat = target.getLatitude();double ALon = target.getLongitude();// 以下语句判断A点是否在边的两端点的水平平行线之间,在则可能有交点,开始判断交点是否在左射线上if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1))) {if (Math.abs(dLat1 - dLat2) > 0) {//得到 A点向左射线与边的交点的x坐标:dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat) ) / (dLat1 - dLat2);// 如果交点在A点左侧(说明是做射线与 边的交点),则射线与边的全部交点数加一:if (dLon < ALon) {iSum++;}}}}return (iSum % 2) != 0;}

参考:
https://blog.csdn.net/WilliamSun0122/article/details/77994526
https://www.cnblogs.com/qq376324789/p/9047396.html

判断一点是否在多边形内(附Java实现代码)相关推荐

  1. 判断点是否位于多边形内(包含凹多边形)

    如果判断点是否在凸多边形内,则有多种方法,方法简单,计算速度也快,直接使用物理引擎做判断也行 但实际问题中遇到的多边形不一定是凸多边形,它可能是凹边行或者复合多边形判断一个点在多边形内或多边形外,射线 ...

  2. 射线法判断点是否在多边形内-JAVA

    1.定义点 public class Point {private BigDecimal x;private BigDecimal y;public Point() {};@Overridepubli ...

  3. 判断点是否处于多边形内的三种方法(转)

    1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...

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

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

  5. python射线法判断点是否在多边形内

    python3射线法判断点是否在多边形内 射线法 首先我们要先理解什么是射线法.射线法的意思是:在随机点上做一条平行于x轴的射线,方向是x轴正方向,看这条射线与多边形区域的交点个数,如果是偶数,那么这 ...

  6. 你了解欧拉回路吗?(附Java实现代码)

    文章目录 一:什么是欧拉回路? 二: 无向图中欧拉回路存在的条件 三:如何得到欧拉回路 四:Java实现 一:什么是欧拉回路? 不知道你有没有玩过这样一种叫"一笔画",从某一点开始 ...

  7. 二叉树遍历(附Java实现代码)

    二叉树遍历(附Java实现代码) 二叉树遍历可以有两种方法:递归遍历的方式与非递归遍历的方式. 先序遍历就是先遍历根节点再左再右: 中序遍历就是先左再根再右: 后序遍历就是先左再右再根: 先构建这棵树 ...

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

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

  9. 判断某点在多边形内——方法一

    算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目.如果有 ...

最新文章

  1. Menu [D3D9 Source]
  2. 11、InnoDB存储引擎
  3. oracle数据库优化--基本概念
  4. notepad++默认的快捷键整理
  5. 7-3 银行家算法--综合 (50 分)(思路+详解+分析输入)宝宝们 加油
  6. 四川专科学校排名四川计算机,四川省现代计算机职业学院2020年排名
  7. mysql mha reference_MySQL MHA配置常见问题
  8. poi 导出excel 中合并单元格
  9. 思维模型篇:数据化营销的六脉神剑
  10. python音乐播放器以及美观化_Python3.4的标准库
  11. 如何使用navicat premium打开外部.sql文件
  12. 音频频谱图(自定义View——进阶篇2)
  13. gunicorn flask的请求流程
  14. 人脸识别几个解决方案分析与测评
  15. 接口测试平台代码实现54:首页重构-2
  16. 使用Python实现滚动的广告屏幕
  17. gps网络对时Linux,gps网络时间对时服务器的功能简介
  18. 地理总结(三)--川南川北川东川西划分
  19. 【前言】 VVC理论知识之基本框架
  20. IT之家,这不是个案

热门文章

  1. 使用 SAP UI5 绘制 Business Rule Control
  2. 表格某列实现动态隐藏展示
  3. 细节--Java必须先创建文件夹再创建文件
  4. 商业分析师应如何构建一个商业故事
  5. pg_restore恢复备份(记录一下)
  6. 2022最新微信小程序常见面试题总结
  7. css布局-多行文字垂直居中
  8. Arm居然为Cortex-M发布了专属显卡驱动!
  9. python里怎么使用snip_MacOS下好用的截图软件snip
  10. iOS 保持界面流畅的技巧,满满都是收获。