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);
JS判断坐标点是否在给定的多边形内
Wesley13
2021-10-11
1150 0 0
点赞
收藏
评论区
加载中...