微信地图多边形算法及判断点位是否在多边形中
最新一个小项目,需要用到地图定义自由区域,并判断选点是否落在此区域内,思路是通过map的polygons中的points来定义多边形边界,通过polygons的fillColor 、 strokeColor、strokeWidth来进行选区颜色的渲染。 然后再通过地图中心点位的移动来确定需要判断的选点(因为小程序地图目前不支持直接点击地图选点获取坐标,只能是触发一个chooseLocation,而我又不想这么麻烦用chooseLocation)
最重要的来了,就是这个点位如何判断是在多边形里面或者外面。。。。。其实这就是一个数学问题,经过我多方参考,判断的数学原理就是:
1、选取目标区域每2个点的y坐标y1及y2,如果满足 y1<y <y2 则记为有效边
2、以选取的点为中心做一条直线, 与上述的有效边相交,求交点的x值,如果交点的x值大于选取点的x值 ,则记1, 否则记0, 计数全部加起来 ,如果最终得到的计数是单数,则选取点在区域内,如果是双数,则在区域外
这么说可能不直观,我画几个图:
这个属于所有的点的y值都大于选点的y值,则在区域外,
这个是所有的点的y值都小于选点的y值,也在区域外
这里满足y1<y<y2的 有4条边, 但是满足多边形y值大于选点y值的只有3个, 是奇数,所以选点在多边形区域内
这里满足y1<y<y2的 有4条边,但是满足多边形y值大于选点y值的有4个,是偶数,所以选点在多边形区域外
判断的函数代码:
//我这里用的 x 来判断 x1<x<x2 用y来判断相交的点位数 实际上效果一样
//point为选取的点坐标, polygon为多边形的点坐标数组
function isPointInPolygon (point, polygon) {var nCross = 0;var n = polygon.length//遍历多边形每一条线for(let i =0 ;i< n;i++){var p1=polygon[i] //定义第一个点的坐标var p2=polygon[(i+1)%n] //定义下一个点的坐标,%n的作用在于让最后一个点的坐标与第一个点坐标重合//如果两点之间与y轴平行,则进行下一轮循环if(Number(p1.longitude) == Number(p2.longitude)) continue;//如果两点之间的x值都大于选取点的x值 ,则进行下一轮循环if(Number(point[0]) < Math.min(Number(p1.longitude),Number(p2.longitude)))continue;//如果两点之间的x值都小于或等于选取点的x值 ,则进行下一轮循环if(Number(point[0]) >=Math.max(Number(p1.longitude),Number(p2.longitude)))continue;//如果x1<x<x2 ,且已知x,则通过两点间直线公式, 算出交点yvar y = (Number(point[0]) - Number(p1.longitude)) *(Number(p2.latitude)-Number(p1.latitude)) / (Number(p2.longitude)-Number(p1.longitude)) + (Number(p1.latitude))//交点y值大于选点y值 则计数if (y > Number(point[1]))nCross ++;}//遍历完了之后求交点y值大于选点y值的数量奇偶,奇数返回true ,偶数返回false return (nCross%2 === 1)}
接下来调用此函数, 返回true 就说明选点在多边形区域内, 否则就是在之外
微信地图多边形算法及判断点位是否在多边形中相关推荐
- php 判断点在多边形内,PHP判断点是否在多边形区域内外
PHP判断点是否在多边形区域内外: 根据数学知识的射线法,射线与几何多边形相交的点的个数为奇数则是在几何内部: 偶数在外部:/** * Created by PhpStorm. * function: ...
- 七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断
注:此时我已经完成了一个演示版本,但是为了文章的渐进性,我将把开发过程一步步的写出来,用来记录. 本实验代码用到的图形学关系和算法列举如下: 基本计算机图形学关系和算法 1.点在多边形内部的 点在多边 ...
- PHP 判断点是否在多边形内
如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...
- 通过坐标点位,计算多边形面积
多边形面积 本文使用三角形面积累计法计算多边形面积,就是将多边形按照一个顶点,分割成多个三角形,计算三角形的面积,累加,得到多边形的面积. 当然,这个算法也有一些缺点,当这个多边形比较奇怪的时候,不能 ...
- c#竖直射线法判断点是否再多边形里面
一.开发环境: VS2017 C#winform 二.竖直射线法大致介绍 通过被判断的点P(x0,y0)引出竖直的上下两条射线,如果两条射线与多变形的交点都为奇数个,那么这个点再多边形里面,反之, ...
- 判断点是否处于多边形内的三种方法(转)
1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...
- 【百度地图API】如何判断点击的是地图还是覆盖物?
原文:[百度地图API]如何判断点击的是地图还是覆盖物? 摘要:很多API爱好者问我,为什么我点击的是marker,而map也会响应该事件呢?怎样才能判断,我点击的是标注,还是地图呢?下面一起来看看. ...
- 几何常用算法与判断线段相交【转】
下面这个函数在我写的计算几何库函数里面有,那个库可以在http://algorithm.126.com/的资源中心 - 代码角 找到. 算法简单说明: 首先判断以两条线段为对角线的矩形是否 ...
- 判断点是否在多边形内部
如何判断一个点是否在多边形内部? (1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部. (2)夹角和判别法:判断目标点与所有边的夹角和是否为360度, ...
最新文章
- python框架之Flask基础篇(一)
- python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)
- JavaScript的代码编写注意事项,建议收藏!
- shiro java配置,InI 配置 - 跟我学 Apache Shiro_教程_Java开发社区
- HTML期末作业-家乡网站
- 分库分表解决方案之ShardingSphere
- 主干开发前要知道的,4错误认识+3优势
- 惠普战66拆机加固态_惠普战66测评:想要提高办公效率,惠普是你的品质之选...
- 稀疏矩阵-sparse 存储和转换
- R数据分析:如何绘制回归分析结果的森林图
- Excel中文拼音首字母缩写函数
- 如何随心意改变桌面快捷方式的图标
- 文件锁(三)——文件锁的原理
- 每日一学33——Unity点击UGUI按钮后,再按空格键会自动触发按钮
- 如何看待腾讯云电子签呢?
- Dremel学习总结1
- 开源软件架构 zeromq
- 托业考试常遇到的科学论文词汇汇总
- foxmail邮件加载失败重试_foxmail 提示错误
- AutoCTS: Automated Correlated Time Series Forecasting
热门文章
- JS基础21-Git版本控制工具
- git笔记(一)git版本管理
- python识别滑块验证码_干掉验证码!使用Python图像识别移动滑块验证码
- Python pyautogui 图像识别
- 一种双灰度传感器巡黑线方案:完美解决小车循迹时左右摇摆的问题
- java swing text_Java swing里怎么获得TextField手动输入的值?
- 分享到朋友圈没有缩略图?微信自定义标题描述及缩略图最简单完美的办法!...
- 青少年CTFmisc-间谍的录音
- super/this
- 50个Pandas的奇淫技巧:一网打尽各种索引 iloc,loc,ix,iat,at…