最新一个小项目,需要用到地图定义自由区域,并判断选点是否落在此区域内,思路是通过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 就说明选点在多边形区域内, 否则就是在之外

微信地图多边形算法及判断点位是否在多边形中相关推荐

  1. php 判断点在多边形内,PHP判断点是否在多边形区域内外

    PHP判断点是否在多边形区域内外: 根据数学知识的射线法,射线与几何多边形相交的点的个数为奇数则是在几何内部: 偶数在外部:/** * Created by PhpStorm. * function: ...

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

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

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

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

  4. 通过坐标点位,计算多边形面积

    多边形面积 本文使用三角形面积累计法计算多边形面积,就是将多边形按照一个顶点,分割成多个三角形,计算三角形的面积,累加,得到多边形的面积. 当然,这个算法也有一些缺点,当这个多边形比较奇怪的时候,不能 ...

  5. c#竖直射线法判断点是否再多边形里面

    一.开发环境: VS2017   C#winform 二.竖直射线法大致介绍 通过被判断的点P(x0,y0)引出竖直的上下两条射线,如果两条射线与多变形的交点都为奇数个,那么这个点再多边形里面,反之, ...

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

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

  7. 【百度地图API】如何判断点击的是地图还是覆盖物?

    原文:[百度地图API]如何判断点击的是地图还是覆盖物? 摘要:很多API爱好者问我,为什么我点击的是marker,而map也会响应该事件呢?怎样才能判断,我点击的是标注,还是地图呢?下面一起来看看. ...

  8. 几何常用算法与判断线段相交【转】

    下面这个函数在我写的计算几何库函数里面有,那个库可以在http://algorithm.126.com/的资源中心   -   代码角   找到. 算法简单说明: 首先判断以两条线段为对角线的矩形是否 ...

  9. 判断点是否在多边形内部

    如何判断一个点是否在多边形内部? (1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部. (2)夹角和判别法:判断目标点与所有边的夹角和是否为360度, ...

最新文章

  1. 【Docker】在Docker中安装redis、rabbitmq
  2. 设置计算机的启动顺序CDROM.C.A,amibios怎么设置cdrom
  3. 方法的直接调用,反射调用与……Lambda表达式调用
  4. android清理缓存功能吗,Android清理缓存功能实现
  5. .svn文件夹_SVN下载安装及使用教程(二)
  6. web前端基础(01html基本标签)
  7. 《Gradle权威指南》--Android Gradle多项目构建
  8. tcp协议报文和三次握手与四次挥手
  9. Perl导入代码文件
  10. 使用字符串格式化函数
  11. verilog设计一个补码加减法运算器_一文搞懂:计算机中为什么用补码来存储数据?...
  12. 禅道下载与安装教程(完整版)
  13. c语言考试题库大一下学期基础,c语言考试题(全国c语言二级考试题库)
  14. 卷积码主要是对抗_采用卷积编码的原因和优势 浅析卷积码之特点
  15. JVM垃圾回收机制 (垃圾判断,垃圾回收算法,垃圾回收器,五种引用)【jvm】
  16. 伴随方法:线性方程的伴随方程(Adjoint Equation)
  17. Wordpress主题制作之首页
  18. Tabbed Postman下载地址
  19. 【Jupyter常用快捷键】
  20. 重温线性代数(1)——线性组合

热门文章

  1. 原生JS灵魂之问——你真的懂这些JS吗?
  2. 初创项目如何获得媒体的曝光
  3. Java swing如何做出菜单栏控制工具栏的界面
  4. 常见英语缩写的正确含义与错误理解——经常更新
  5. R包WGCNA---转录组WGCNA共表达网络构建(无表型计算提取网络)
  6. 绿色创意2.0 探访阿里千岛湖数据中心
  7. SiT9375:200fs超低抖动差分晶振,25-644.53125MHz,LVPECL/LVDS/HCSL
  8. PCB原理图绘制(3)——元器件的基本放置与查找添加
  9. js整形转成double_在NodeJS插件中将args转换为double
  10. 密码设置有关方法:不能相同字母,不能为连续字符