牙叔教程 简单易懂
copilot 版本
//判断点P在多边形内-射线法 function isPointInPolygon(point, polygon) { var x = point.x, y = point.y; var inside = false; for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) { var xi = polygon[i].x, yi = polygon[i].y; var xj = polygon[j].x, yj = polygon[j].y; var intersect = yi > y != yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi; if (intersect) inside = !inside; } return inside; } let point = { x: 0, y: 0, }; let polygon = [ { x: 0, y: 0 }, { x: 0, y: 100 }, { x: 100, y: 100 }, { x: 100, y: 0 }, ]; let inside = isPointInPolygon(point, polygon); console.log(inside);
群成员 Mindfulness 的版本
/** * @typedef Point * @property {number} x * @property {number} y */ /** * 判断一个点是否在多边形内部 * * @param {Point} point 待判断的点 * @param {Point[]} polygonPoints 多边形的顶点数组 * @param {boolean} includeBorder 待判断点位于多边形边线上时, 是否判断为内部 * @returns {boolean} */ function isPointInPolygon(point, polygonPoints, includeBorder = true) { // 取多边形各定点的xy值最大最小值 const minX = Math.min(polygonPoints.map(p => p.x)) const maxX = Math.max(polygonPoints.map(p => p.x)) const minY = Math.min(polygonPoints.map(p => p.y)) const maxY = Math.max(polygonPoints.map(p => p.y)) // 超出最大最小范围的, 一定在多边形外部 if (point.x < minX || point.x > maxX || point.y < minY || point.y > maxY) return false // 被判断点的y值, 一定在多边形的最大最小y值之间 // 从被判断点开始, 向90度引出一条射线 (横线) // 依次处理每个顶点 // 每个顶点与上一点连成一条边线, 判断射线与此边线的是否有交叉 const crossState = polygonPoints.map((p, i) => { // 另一个顶点 const op = i === 0 ? polygonPoints[polygonPoints.length - 1] : polygonPoints[i - 1] console.log(p, op) // 如果该条边线为竖线 if (op.x === p.x) { // 如果包含边界, 则射线与边线两端任一点重合即为在多边形内部 if ((point.y === op.y || point.y === p.y) && includeBorder) return true // 否则判断射线的y值是否在边线的两端y值之间 const [loY, hiY] = [po.y, p.y].sort() return point.y > loY && point.y < hiY } // 如果该条边线为横线 if (op.y === p.y) return includeBorder ? point.y === op.y : false // 两点组成的直线正切值 const tan = (op.y - p.y) / (op.x - p.x) // 计算当前两个顶点的连线与射线交点, 如果交点的x值超出两点范围, 则该边与射线不相交 const x = (point.y - p.y) / tan return includeBorder ? x >= p.x && x <= po.x : x > p.x && x < po.x }) return crossState.filter(p => p).length % 2 === 1 } const polygonPoints = [ { x: 100, y: 50 }, { x: 50, y: 100 }, { x: 200, y: 120 }, ] const fromPoint = { x: 66, y: 77 } const isIn = isPointInPolygon(fromPoint, polygonPoints) console.log(isIn)
相关文档
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 --- 牙叔教程
声明
部分内容来自网络 本教程仅用于学习, 禁止用于其他用途