JS判断坐标点是否在给定的多边形内

1(function (window) { 2 "use strict"; 3 /** 4 * 判断给出的坐标点是否在多边形内 5 * */ 6 function pointInPolygon(targetPoint, targetPoints) { 7 var leftPointCount = 0; 8 var rightPointCount = 0;//左右点的个数 9 var _points = []; 10 //第一步:取出所有的点,并计算交点坐标 11 for (var i = 0, _length = targetPoints.length - 1; i < _length; i++) { 12 var p1 = targetPoints[i], p2 = targetPoints[i + 1];//取出当前点和当前点的下一个点 13 var point = _calcCrossoverPoint(targetPoint, p1, p2); 14 //如果交点有效,则保存 15 if (point) { 16 _points.push(point); 17 } 18 } 19// 第二步:计算给定的坐标点,左右两边的交点个数,奇数在范围内,偶数则不在 20 for (var j = 0, length = _points.length; j < length; j++) { 21 var x = _points[j]; 22 if (x === targetPoint.x) { 23 return false;//在线上,直接返回不在范围内 24 } else { 25 (targetPoint.x !== x && targetPoint.x > x) ? leftPointCount++ : rightPointCount++; 26 } 27 } 28 //判断交点个数 29 return (leftPointCount % 2 !== 0 && rightPointCount % 2 !== 0); 30 } 31 32 /** 33 * 算交点坐标,坐标点在扫描行上或者上方时,交点无效 34 * @param targetPoint 35 * @param startPoint 36 * @param endPoint 37 * @returns {*} 38 */ 39 function _calcCrossoverPoint(targetPoint, startPoint, endPoint) { 40 var crossoverPointX = startPoint.x - ((startPoint.y - targetPoint.y) * (startPoint.x - endPoint.x) / (startPoint.y - endPoint.y)); 41// 判断交点坐标是否有效,即交点在startPoint,endPoint构成的线段范围内 42 if ((startPoint.y < targetPoint.y && endPoint.y >= targetPoint.y) || (endPoint.y < targetPoint.y && startPoint.y >= targetPoint.y)) { 43 if ((crossoverPointX >= startPoint.x && crossoverPointX <= endPoint.x) || (crossoverPointX <= startPoint.x && crossoverPointX >= endPoint.x)) { 44 return crossoverPointX; 45 } else { 46 return false; 47 } 48 } else { 49 return false; 50 } 51 52 } 53 54 var isIn = pointInPolygon({x: 4, y: 4}, [{x: 2, y: 1}, {x: 1, y: 3}, {x: 3, y: 5}, {x: 5, y: 4}, { 55 x: 4, 56 y: 1 57 }, {x: 3, y: 2}, { 58 x: 2, 59 y: 1 60 }]); 61 console.log(isIn); 62 })(window);
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )