判断一点是否在多边形内(附Java实现代码)
引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法
时间复杂度: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实现代码)相关推荐
- 判断点是否位于多边形内(包含凹多边形)
如果判断点是否在凸多边形内,则有多种方法,方法简单,计算速度也快,直接使用物理引擎做判断也行 但实际问题中遇到的多边形不一定是凸多边形,它可能是凹边行或者复合多边形判断一个点在多边形内或多边形外,射线 ...
- 射线法判断点是否在多边形内-JAVA
1.定义点 public class Point {private BigDecimal x;private BigDecimal y;public Point() {};@Overridepubli ...
- 判断点是否处于多边形内的三种方法(转)
1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...
- 如何判断一个点在多边形内
一.从三角形开始说起---怎么判断一个点在三角形内 三角形是最简单的多边形了.先说说三角形有哪些判断方法. 参考自:判断一个点是否在三角形内部 - 知乎 几种方法判断平面点在三角形内_独L无二的博客- ...
- python射线法判断点是否在多边形内
python3射线法判断点是否在多边形内 射线法 首先我们要先理解什么是射线法.射线法的意思是:在随机点上做一条平行于x轴的射线,方向是x轴正方向,看这条射线与多边形区域的交点个数,如果是偶数,那么这 ...
- 你了解欧拉回路吗?(附Java实现代码)
文章目录 一:什么是欧拉回路? 二: 无向图中欧拉回路存在的条件 三:如何得到欧拉回路 四:Java实现 一:什么是欧拉回路? 不知道你有没有玩过这样一种叫"一笔画",从某一点开始 ...
- 二叉树遍历(附Java实现代码)
二叉树遍历(附Java实现代码) 二叉树遍历可以有两种方法:递归遍历的方式与非递归遍历的方式. 先序遍历就是先遍历根节点再左再右: 中序遍历就是先左再根再右: 后序遍历就是先左再右再根: 先构建这棵树 ...
- PHP 判断点是否在多边形内
如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...
- 判断某点在多边形内——方法一
算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目.如果有 ...
最新文章
- Menu [D3D9 Source]
- 11、InnoDB存储引擎
- oracle数据库优化--基本概念
- notepad++默认的快捷键整理
- 7-3 银行家算法--综合 (50 分)(思路+详解+分析输入)宝宝们 加油
- 四川专科学校排名四川计算机,四川省现代计算机职业学院2020年排名
- mysql mha reference_MySQL MHA配置常见问题
- poi 导出excel 中合并单元格
- 思维模型篇:数据化营销的六脉神剑
- python音乐播放器以及美观化_Python3.4的标准库
- 如何使用navicat premium打开外部.sql文件
- 音频频谱图(自定义View——进阶篇2)
- gunicorn flask的请求流程
- 人脸识别几个解决方案分析与测评
- 接口测试平台代码实现54:首页重构-2
- 使用Python实现滚动的广告屏幕
- gps网络对时Linux,gps网络时间对时服务器的功能简介
- 地理总结(三)--川南川北川东川西划分
- 【前言】 VVC理论知识之基本框架
- IT之家,这不是个案