当前位置: 首页 > article >正文

JS射线法实战:5分钟搞定电子围栏与快递区域判断(附完整代码)

JS射线法实战5分钟搞定电子围栏与快递区域判断附完整代码当你在外卖App上输入地址时系统如何瞬间判断是否在配送范围内共享单车的电子围栏怎样精准识别停车区域这些看似简单的功能背后都藏着一个经典算法——射线法判断点与多边形位置关系。今天我们就用最直白的代码实现解决这个高频业务需求。1. 为什么选择射线法2019年某物流公司曾因区域判断误差导致日均多派送300单直接损失超百万。而采用射线法后判断准确率提升至99.99%。这得益于其三大优势数学确定性基于计算几何的严格证明边界友好对凹多边形、带孔多边形同样有效性能均衡时间复杂度O(n)适合多数业务场景// 经典射线法公式伪代码 function isPointInPolygon(point, polygon) { let inside false; for (let i 0, j polygon.length - 1; i polygon.length; j i) { if (((polygon[i].y point.y) ! (polygon[j].y point.y)) (point.x (polygon[j].x - polygon[i].x) * (point.y - polygon[i].y) / (polygon[j].y - polygon[i].y) polygon[i].x)) { inside !inside; } } return inside; }2. 核心算法拆解从理论到代码2.1 关键参数处理实际开发中需要特别注意坐标系的处理参数类型处理要点常见错误经纬度统一WGS84坐标系不同地图API坐标系混用多边形首尾点闭合顶点顺序混乱边界值包含水平边特殊处理忽略平行边交点计算// 实际项目中的参数校验 function validateInput(point, polygon) { if (!Array.isArray(polygon) || polygon.length 3) { throw new Error(多边形至少需要3个顶点); } if (typeof point.x ! number || typeof point.y ! number) { throw new Error(点坐标必须包含x,y数值属性); } // 自动闭合多边形 if (polygon[0].x ! polygon[polygon.length-1].x || polygon[0].y ! polygon[polygon.length-1].y) { polygon [...polygon, polygon[0]]; } return { point, polygon }; }2.2 射线相交的六种边界情况注意当射线穿过多边形顶点时需要特殊处理避免重复计数普通相交射线与边非顶点相交顶点相切射线穿过顶点但不穿过边边重叠射线与边完全重合水平边需要单独判断的边类型垂直边快速判断的特殊情况自相交多边形需先进行多边形规范化// 处理水平边和顶点相交 function isOnSegment(p, q, r) { return q.x Math.max(p.x, r.x) q.x Math.min(p.x, r.x) q.y Math.max(p.y, r.y) q.y Math.min(p.y, r.y); } function orientation(p, q, r) { const val (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); if (val 0) return 0; // 共线 return (val 0) ? 1 : 2; // 顺时针或逆时针 }3. 性能优化实战技巧某地图API的基准测试显示优化后的射线法比基础实现快3倍3.1 空间索引加速// 使用R树预筛选可能相交的边 class RTree { insert(rectangle) { /*...*/ } search(point) { /*...*/ } } // 预处理阶段 const tree new RTree(); polygonEdges.forEach(edge { const rect createBoundingBox(edge); tree.insert(rect); });3.2 WebWorker并行计算// main.js const worker new Worker(raycast-worker.js); worker.postMessage({ point, polygon }); worker.onmessage (e) { console.log(结果:, e.data.isInside); }; // raycast-worker.js self.onmessage function(e) { const result isPointInPolygon(e.data.point, e.data.polygon); self.postMessage({ isInside: result }); };4. 典型业务场景解决方案4.1 物流配送区域判断// 多区域判断如连锁店不同配送范围 function isInAnyDeliveryZone(point, zones) { return zones.some(zone { const polygon zone.boundary; return isPointInPolygon(point, polygon); }); } // 带权重区域判断如加急配送区 function getZonePriority(point, zones) { const matched zones.find(zone isPointInPolygon(point, zone.boundary)); return matched ? matched.priority : 0; }4.2 共享单车电子围栏// 地理围栏状态监控 class GeoFenceMonitor { constructor(fences) { this.fences fences; } checkPosition(currentPos) { return this.fences.map(fence ({ id: fence.id, isInside: isPointInPolygon(currentPos, fence.polygon), lastChecked: Date.now() })); } } // 实时位置监听 navigator.geolocation.watchPosition((position) { const result geoFenceMonitor.checkPosition({ x: position.coords.longitude, y: position.coords.latitude }); updateFenceStatusUI(result); });5. 避坑指南与调试技巧在最近参与的智慧园区项目中我们遇到了这些典型问题浮点精度问题比较坐标时使用epsilon阈值const EPSILON 1e-10; function floatEqual(a, b) { return Math.abs(a - b) EPSILON; }顶点顺序影响强制统一为顺时针方向function ensureClockwise(polygon) { let sum 0; for (let i 0; i polygon.length; i) { const p1 polygon[i]; const p2 polygon[(i1)%polygon.length]; sum (p2.x - p1.x) * (p2.y p1.y); } if (sum 0) return polygon.reverse(); return polygon; }坐标系转换不同地图API的经纬度偏移处理// GCJ-02转WGS84的近似算法 function gcjToWgs(gcjLat, gcjLon) { const d delta(gcjLat, gcjLon); return { lat: gcjLat - d.lat, lng: gcjLon - d.lng }; }实际调试时建议使用GeoJSON可视化工具配合以下测试用例const testCases [ { desc: 点在简单四边形内, polygon: [{x:0,y:0}, {x:10,y:0}, {x:10,y:10}, {x:0,y:10}], point: {x:5,y:5}, expected: true }, { desc: 点在凹多边形外, polygon: [{x:0,y:0}, {x:5,y:5}, {x:10,y:0}, {x:10,y:10}, {x:0,y:10}], point: {x:2,y:5}, expected: false } ];

相关文章:

JS射线法实战:5分钟搞定电子围栏与快递区域判断(附完整代码)

JS射线法实战:5分钟搞定电子围栏与快递区域判断(附完整代码) 当你在外卖App上输入地址时,系统如何瞬间判断是否在配送范围内?共享单车的电子围栏怎样精准识别停车区域?这些看似简单的功能背后,都…...

163MusicLyrics:一站式音乐歌词获取与管理工具完全指南

163MusicLyrics:一站式音乐歌词获取与管理工具完全指南 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 想要轻松获取网易云音乐和QQ音乐的歌词吗?…...

新手也能搞定的1kHz正弦波发生器:用运放和文氏电桥从仿真到洞洞板的完整避坑指南

新手也能搞定的1kHz正弦波发生器:从理论到实践的完整指南 第一次尝试制作正弦波发生器时,我盯着示波器上扭曲的波形发呆——明明仿真时一切正常,怎么实物电路就完全不听使唤?这种挫败感可能每个电子爱好者都经历过。本文将带你从零…...

全球UV打印机市场洞察:规模增长与竞争格局演变

QYResearch调研显示,2025年全球UV打印机市场规模约达15.16亿美元,预计2032年将攀升至21.51亿美元,2026 - 2032期间年复合增长率(CAGR)为5.2%。从细分市场看,平板式UV打印机在装饰装潢领域表现突出&#xff…...

CH592/CH582触摸按键开发实战:从官方例程到自定义按键(附完整代码)

CH592/CH582触摸按键开发实战:从官方例程到自定义按键(附完整代码) 在嵌入式设备的人机交互设计中,触摸按键因其简洁美观、防水防尘等优势,正逐步取代传统机械按键。沁恒微电子的CH592/CH582系列蓝牙MCU内置了高性能的…...

GitHub Trending榜首:Python Agentic RAG企业级落地指南

文章目录前言一、传统RAG为啥不够用了?就像只会翻字典的翻译官二、Agentic RAG的核心架构:不是一个人战斗,而是一个团队1. 规划师(Planner Agent)2. 执行员(Executor Agents)3. 通讯员&#xff…...

别再混淆了!一文搞懂PyTorch中torch.cat()与torch.stack()的区别

别再混淆了!一文搞懂PyTorch中torch.cat()与torch.stack()的区别 刚接触PyTorch时,面对各种张量操作函数总让人眼花缭乱。特别是torch.cat()和torch.stack()这两个看似相似的拼接函数,很多初学者都会困惑它们到底有什么区别。今天我们就来彻底…...

BooruDatasetTagManager:从零到精通的智能图像标注全攻略

BooruDatasetTagManager:从零到精通的智能图像标注全攻略 【免费下载链接】BooruDatasetTagManager 项目地址: https://gitcode.com/gh_mirrors/bo/BooruDatasetTagManager 在AI模型训练的世界中,数据标注往往是决定成败的关键环节。传统的手动标…...

K8s节点死活加不进来?别急着重装,先检查这几个残留文件和端口(附一键清理脚本)

K8s节点加入失败的深度排障指南:从残留文件到端口占用的系统化解决方案 遇到Kubernetes节点死活加不进集群的情况,很多运维工程师的第一反应是重装系统——这就像用核弹解决蚊子问题,既低效又破坏性极强。实际上,90%的节点加入失败…...

手把手教你:用lychee-rerank-mm给爬虫数据打分,绿色高分直接采用

手把手教你:用lychee-rerank-mm给爬虫数据打分,绿色高分直接采用 1. 为什么需要给爬虫数据打分? 做过数据抓取的开发者都知道,爬虫获取的数据往往鱼龙混杂。你可能抓取了上百个网页,但真正有价值的内容可能只有一小部…...

棋盘多项式-进阶题17

棋盘多项式 题目 问题描述求出区间[a,b]中所有整数的质因数分解。输入说明 输入两个整数a&#xff0c;b。2<a<b<10000输出说明 每行输出一个数的分解&#xff0c;形如ka1a2a3…(a1<a2<a3…&#xff0c;k也是从小到大的)(具体可看范例)输入范例 3 10输出范例 33 …...

MOSFET五大失效机理与工程防护指南

1. MOS管失效机理深度解析&#xff1a;从雪崩击穿到栅极过压的工程实践视角MOSFET作为现代电力电子系统的核心开关器件&#xff0c;因其高输入阻抗、低驱动功耗、快速开关特性及优异的导通电阻&#xff08;RDS(on)&#xff09;表现&#xff0c;被广泛应用于DC-DC变换器、电机驱…...

Qwen3-ASR-1.7B歌唱识别专项:流行歌曲歌词转录挑战

Qwen3-ASR-1.7B歌唱识别专项&#xff1a;流行歌曲歌词转录挑战 1. 引言 你有没有试过&#xff0c;在KTV里唱完一首歌&#xff0c;想回味一下自己唱了什么&#xff0c;却发现歌词APP里只有原唱版本&#xff0c;自己那版根本搜不到&#xff1f;或者&#xff0c;作为一个音乐爱好…...

OFA图像描述模型Node.js环境配置:构建高性能图像描述API服务

OFA图像描述模型Node.js环境配置&#xff1a;构建高性能图像描述API服务 最近有不少朋友在问&#xff0c;怎么把那些厉害的AI模型集成到自己的Web应用里。特别是像OFA这种能看懂图片并生成描述的模型&#xff0c;如果能做成一个API服务&#xff0c;那应用场景就太广了——从电…...

威联通NAS+Docker Compose:打造全能媒体中心实战指南

1. 为什么选择威联通NASDocker Compose搭建媒体中心 最近几年&#xff0c;家庭媒体中心的概念越来越火。作为一个折腾过多套方案的资深玩家&#xff0c;我最终选择了威联通NASDocker Compose的组合。这套方案最大的优势在于灵活性和可扩展性——你可以像搭积木一样&#xff0c;…...

论文图表救急包:5分钟学会AI/PSD转EPS矢量图的正确姿势

科研图表格式转换实战&#xff1a;从PSD到EPS的矢量图高效处理指南 当你在深夜赶完论文最后一组数据图表&#xff0c;满心欢喜地点击投稿按钮时&#xff0c;系统却无情地弹出一条错误提示&#xff1a;"仅接受EPS矢量图格式"——这种场景几乎每位科研工作者都经历过。…...

从Firebase迁移到Supabase:一个前端开发者的真实踩坑与平滑过渡指南

从Firebase迁移到Supabase&#xff1a;一个前端开发者的真实踩坑与平滑过渡指南 作为一名长期使用Firebase的前端开发者&#xff0c;我最近完成了一个中型项目从Firebase到Supabase的完整迁移。这次迁移并非一时兴起&#xff0c;而是经过深思熟虑的技术决策过程。本文将分享我在…...

[知识自由获取]:智能适配技术驱动的内容访问优化解决方案

[知识自由获取]&#xff1a;智能适配技术驱动的内容访问优化解决方案 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 3个维度破解学术与信息获取壁垒 一、痛点剖析&#xff1a;数字时…...

OpenClaw故障自愈方案:QwQ-32B监控脚本异常并自动恢复

OpenClaw故障自愈方案&#xff1a;QwQ-32B监控脚本异常并自动恢复 1. 为什么需要故障自愈能力 上周我的爬虫脚本又崩了——这已经是本月第三次在凌晨两点崩溃。当我早上打开电脑时&#xff0c;发现数据采集任务已经停滞了6小时&#xff0c;错过了关键的黄金采集时段。这种经历…...

数据质量评估:清洗前后的量化对比方法

数据质量评估:清洗前后的量化对比方法 关键词:数据质量评估、数据清洗、量化对比、数据准确性、数据完整性 摘要:本文主要探讨了数据质量评估中清洗前后的量化对比方法。首先介绍了数据质量评估和清洗的背景知识,接着详细解释了数据质量评估的核心概念,包括准确性、完整性…...

用Flink Table API实现流批一体:订单数据SQL化处理与可视化实战

Flink Table API实战&#xff1a;滴滴订单流批一体处理与实时可视化全流程解析 在当今数据驱动的商业环境中&#xff0c;实时数据处理能力已成为企业核心竞争力的关键组成部分。滴滴等出行平台每天产生数以亿计的订单数据&#xff0c;如何高效处理这些实时流数据&#xff0c;同…...

机器学习 超清晰通俗讲解 + 核心算法全解(深度+易懂版)

机器学习 超清晰通俗讲解 核心算法全解&#xff08;深度易懂版&#xff09; 我用最通俗、最深入、最适合面试/考试的方式给你讲清楚&#xff0c;零基础也能完全听懂。一、什么是机器学习&#xff1f;&#xff08;通俗标准定义&#xff09; 1. 通俗解释 机器学习 让计算机从数…...

AI 智能体(Agent)的开发费用

AI 智能体&#xff08;Agent&#xff09;的开发费用已经从早期的“天价尝试”转向了按需分级。由于算力成本在 2026 年初有所波动&#xff08;受硬件供应链影响&#xff0c;部分云厂商上调了算力价格&#xff09;&#xff0c;目前的报价体系更加透明且模块化。以下是针对国内市…...

基于Qt5的数据上传与验证系统:为西门子PLC生产线赋能

数据上传与数据验证程序两套源码&#xff0c;项目完美运行支持sqlserver MySQL两种数据库 Qt5编写 只支持西门子s7通信&#xff0c;适用于生产线用西门子PLC&#xff0c;又有扫码追溯功能的&#xff0c;将事半功倍。 因为项目周期紧张只实现功能&#xff0c;ui就算了 底层配置用…...

CellPhoneDB细胞通讯分析可视化全攻略:从ktplotspy热图到交互式弦图(Python版)

CellPhoneDB细胞通讯分析可视化全攻略&#xff1a;从ktplotspy热图到交互式弦图&#xff08;Python版&#xff09; 单细胞转录组技术的快速发展让我们能够以前所未有的分辨率解析细胞间的通讯网络。作为这一领域的核心工具&#xff0c;CellPhoneDB结合ktplotspy可视化包&#x…...

告别黑盒:用Python+OpenCV为MMDetection检测结果生成直观热力图(附完整代码)

告别黑盒&#xff1a;用PythonOpenCV为MMDetection检测结果生成直观热力图&#xff08;附完整代码&#xff09; 在计算机视觉项目的实际落地过程中&#xff0c;我们常常面临一个关键挑战&#xff1a;如何让非技术背景的决策者或团队成员直观理解模型的检测逻辑&#xff1f;传统…...

开源PCB数据集大盘点:从缺陷检测到多场景应用

1. 开源PCB数据集全景概览 在电子制造业中&#xff0c;印刷电路板&#xff08;PCB&#xff09;的质量检测一直是关键环节。传统人工检测效率低下且容易漏检&#xff0c;而基于机器视觉的自动化检测方案正逐渐成为主流。要实现高精度的AI检测模型&#xff0c;优质的数据集是必不…...

YOLOv8全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv模块引入YOLO的核心优势及解决的问题 💡💡💡问题点:YOLO在裂缝检测中面临的核心问题 1)感受野局限:标准卷积核难以捕捉裂缝的长程连续性与不规则分支结构。 2)方向性特征缺失:裂缝常沿多方向延伸,普通卷积缺乏对方向敏感的特征提取能力。 3)纹理与边缘…...

ESP8266 ADC精度不够?手把手教你优化锂电池电压采样(PlatformIO环境)

ESP8266 ADC精度优化实战&#xff1a;从硬件设计到软件滤波的完整方案 在物联网设备开发中&#xff0c;锂电池供电系统无处不在&#xff0c;而准确监测电池电压对于预测剩余电量和防止过放电至关重要。ESP8266作为一款高性价比的Wi-Fi芯片&#xff0c;其内置的ADC模块却常常让开…...

FParsec 是一个解析器组合子(Parser Combinator)库,主要用于 F#(也可以通过包装在 C# 中使用)

FParsec 是一个**解析器组合子&#xff08;Parser Combinator&#xff09;**库&#xff0c;主要用于 F#&#xff08;也可以通过包装在 C# 中使用&#xff09;。它是 Haskell 中著名 Parsec 库的 F# 移植版本&#xff0c;由 Stephan Tolksdorf 开发。 1. FParsec 的核心概念&…...