引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法
时间复杂度: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. C#中#region,#if的作用
  2. 数据结构--稀疏矩阵的一种实现
  3. 域用户绑定计算机批量设置,Windows 2008 AD域账户与计算机名批量绑定
  4. linux发送http请求xml报文,使用curl命令行发送/发布xml文件
  5. 深入理解java垃圾回收机制
  6. 阅读笔记一之《软件需求与分析》
  7. mysql 禁止使用enum_MySQL慎用 ENUM 字段
  8. UVAPOJ离散概率与数学期望入门练习[4]
  9. pytorch gather_【CV】10分钟理解Focal loss数学原理与Pytorch代码
  10. 1.空间中直线交点坐标问题,2.已知球面三点求球心问题以及Matlab实现
  11. 阶段3 2.Spring_08.面向切面编程 AOP_8 spring中的环绕通知
  12. 海康摄像头SDK跨平台通用解决方案
  13. gRPC接口性能测试
  14. 数据可视化 - 什么是数据可视化
  15. 2020_ICML_Neuro-Symbolic Visual Reasoning: Disentangling “Visual” from “Reasoning”
  16. php的外文参考文献_php英文文献翻译及参考文献
  17. 电磁波的达朗贝尔方程 工程电磁场P25
  18. [禅悟人生]心不动才能真正认清自己
  19. Redis各版本的特性及架构
  20. 如何学习一门计算机语言(续)

热门文章

  1. 小熊派折叠开发板(一)- 开发板介绍
  2. 办理IDC许可证的条件及材料是什么?
  3. 高德地图实现展示多个规划的路线
  4. Journal of Electronic Imaging 投稿分享
  5. 天津市南洋工业学校计算机应用,一、计算机应用技术技能
  6. 创建证书与Xcode破解
  7. 智商情商哪个重要_情商与智商,到底哪个更重要?
  8. 怡和嘉业在创业板上市:总市值约186亿元,前三季度业绩同比翻倍
  9. [Linux](小白须知)超级用户、普通用户、系统管理员怎么区分
  10. 表格拆分的两种方式 拆分成多个excel工作表或多个excel文件