Javascript判断点是否在多边型内

news2024/12/23 14:46:03

射线法Ray-casting Algorithm算法检查点point是否在多边形里面。

用法:insidePolygon([[x1,y1],[x2,y2],[x3,y3]...], [x , y])

参数说明:

polygon多边形坐标集合,格式为[[x1,y1],[x2,y2],[x3,y3]...]。

point 测试点坐标, 格式为[x , y]。

返回true点在内部,false在外部。

下面是javascript代码。

function insidePolygon(polygon, point){

var x = point[0], y = point[1];

var inside = false;

for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {

var xi = polygon[i][0], yi = polygon[i][1];

var xj = polygon[j][0], yj = polygon[j][1];

var intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);

if (intersect)inside = !inside;

}

return inside;

}

算法解释

  1. 函数参数:point 需要判断的点,polygon是多边形顶点集合

伪代码举例:

polygon包含的顺序为A1,A2,A3,A4,A5

polygon=[A1, A2, A3, A4, A5];

A1=[4, 5];

  1. For循环遍历每个线段,这里例子是5个线段。

2.1 第一次循环是i=0,j=4;

var xi = polygon[0][0], yi = polygon[0][1];

var xj = polygon[4][0], yj = polygon[4][1];

(图1)

2.2 第二次循环是i=1, j=0;

var xi = polygon[1][0], yi = polygon[1][1];

var xj = polygon[0][0], yj = polygon[0][1];

(图2)

依次类推,直到遍历完。

  1. (yi > y) != (yj > y))

首选要判断任意点P的y值,是否在图2的A1 A2这个线段的y轴区间内。

如果在yi和yj线段内结果为true,反之false。

4、x < (xj - xi) * (y - yi) / (yj - yi) + xi

4.1引入两点式直线方程:

4.2 推导方程式

(x-xi)/(xj-xi) = (y-yi)/(yj-yi)

=> x-xi = (xj - xi) * (y - yi) / (yj - yi)

=> x = (xj - xi) * (y - yi) / (yj - yi) + xi

上面的方程式就是求A1A2所构成的直线上,在带入P点的y值后,计算对应的x的值。

绿色的x值为P的实际的x值,计算x值为上面公式推导出的x值。

如果x< 计算x值,说明点在线段的左侧。

5、var intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi)

结果为true就说明P点在线段A1A2的左侧,同时在A1A2的y轴区间内。

也就证明,以P点为起点平行于x轴的射线,跟线段A1A2应该有个交点。

6、if (intersect) inside = !inside;

如果有奇数交点,inside =true。

如果有偶数个交点,inside=false

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术分享| 视频监控融合方案

视频监控系统在各行业应用广泛&#xff0c;从早期的只是简单的实现通过视频记录监控区域的情况&#xff0c;到现在的监控侦测、智能报警、融合通信等功能&#xff0c;视频监控的作用已经不是简单的记录&#xff0c;分布在各地的视频监控摄像头可以通过复杂的软件算法实现更多智…

数据分析的尽头不是可视化,而是行动!行动!行动!

Kyligence Zen 联动飞书&#xff0c;支持一键推送指标&#xff0c;在飞书就能追踪关键指标的最新动态&#xff1b;指标对齐目标&#xff0c;目标拆解为飞书任务&#xff0c;实现从指标洞察到行动的丝滑闭环&#xff01; 指标是衡量目标的量化参数&#xff0c;也是企业将战略目标…

PC端网页特效:轮播图

轮播图 功能需求&#xff1a; 鼠标经过轮播图模块&#xff0c;左右按钮显示&#xff0c;离开隐藏左右按钮。点击右侧按钮一次&#xff0c;图片往左播放一张&#xff0c; 左侧按钮同理。图片播放的同时&#xff0c;下面小圆圈模块跟随一起变化。点击小圆圈&#xff0c;可以播放…

2023年系统集成项目管理工程师报考条件及时间安排

一、报考条件 二、考试时间安排 集成考试一年会考2次&#xff0c;上半年一次、下半年一次 考试内容&#xff1a; 三、考试知识点分布&#xff1a; 给出一点点中项备考攻略 中级我敢说是好考的&#xff0c;题目也不难&#xff0c;主要弄清楚47个过程的输入输出&#xff0c;还有…

Github每日精选(第87期):轻量级图表lightweight-charts

lightweight-charts TradingView 轻量级图表是最小和最快的金融 HTML5 图表之一。 如果您想在网页上将财务数据显示为交互式图表而不影响网页加载速度和性能&#xff0c;轻量级图表库是您的最佳选择。 如果您想用交互式图表替换静态图像图表&#xff0c;它是您的最佳选择。该…

2000亿补贴申请倒计时!维视智造院校实验室建设攻略来了(六)!

#千亿政策贴息助力院校设备升级#近期&#xff0c;关于高校教育信息化的利好政策密集出台。9月7日&#xff0c;国务院常务会议提出对高校、职业院校和实训基地等10大领域设备购置和更新改造新增贷款&#xff0c;实施阶段性鼓励政策&#xff0c;中央财政贴息2.5个百分点&#xff…

电脑重装系统后文件还能恢复吗?恢复文件的详细图文教程

电脑重装系统&#xff0c;简单来说就是重新安装电脑的操作系统。一般选择重新安装电脑的系统&#xff0c;无非是电脑蓝屏、系统运行速度慢、崩溃死机等问题。 很多人会有疑惑&#xff0c;电脑重装系统后文件还能恢复吗&#xff1f;重装系统会造成数据全部被清空的情况&#xf…

js性能优化小技巧(已更新)

1、if多条件判断如果if里面包含多个判断条件&#xff0c;可以把判断条件存到一个数组&#xff0c;然后在去这个数组中检索”输入的值“是否满足条件&#xff1b;function testIf(x) {// 冗余if (x a || x b || x c || x d) {console.log(x)}// 简洁if ([a, b, c, d].includ…

前端vue3+typescript搭建vite项目(初识vite+项目配置完善+屏幕适配)

一、文章引导 #mermaid-svg-zCCPryl8cvuE0QpI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zCCPryl8cvuE0QpI .error-icon{fill:#552222;}#mermaid-svg-zCCPryl8cvuE0QpI .error-text{fill:#552222;stroke:#55222…

MySQL (五)------多表查询练习

我们在开发中&#xff0c;根据不同的业务需求往往需要通过2张及以上的表中去查询需要的数据。所以我们有必要学习2张及以上的表的查询。其实不管是几张表的查询&#xff0c;都是有规律可循的。 1.1 准备数据 -- 部门表 CREATE TABLE dept (id INT PRIMARY KEY PRIMARY KEY, --…

Databend 开源周报 第 75 期

Databend 是一款强大的云数仓。专为弹性和高效设计。自由且开源。即刻体验云服务&#xff1a;https://app.databend.com 。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Features & Improvements ✨ Format 实现 JSON 输出格式 …

C++模板进阶(非类型模板参数 + 模板特化)

我们另一篇模板初阶介绍链接&#xff1a;http://t.csdn.cn/Ox8Dm 目录 一、非类型模板参数 1.1 非类型模板参数概念 1.2 模板类型的静态数组 二、模板特化 2.1 函数模板特化 2.2 类模板特化 2.2.1 类模板全特化 2.2.2 类模板半特化&#xff08;偏特化&#xff09; 2.2.…

Facebook运营主页需要注意的几个问题

Facebook运营主页需要注意的几个问题主页的权重和流量都是决定流量的关键因素&#xff0c;也就是我们常说的引流&#xff0c;而流量又是需要转化的&#xff0c;因为只有用户认可你&#xff0c;才会有更多的点击、收藏、分享和主页的链接。在社交媒体时代要想更好地推广品牌产品…

openssl 编译动态库 win11 vs2022

官网 openssl官网 安装perl activestate_perl_官网 需要下载cli_installer 下载后双击下载好的exe 一般就是下面这个执行文件 state-remote-installer.exe 需要按照提示在powershell中执行网页提示的命令。 安装nasm nasm官网 以管理员方式运行安装 并加入环境变量中…

《MySQL高级篇》十、数据库其他调优策略

文章目录1.数据库调优的措施1.1调优的目标1.2 如何定位调优问题1.3 调优的维度和步骤第1步&#xff1a;选择适合的DBMS第2步:优化表设计第3步:优化逻辑查询第4步:优化物理查询第5步:使用Redis或 Memcached 作为缓存第6步&#xff1a;库级优化2. 优化MySQL服务器2.1 优化服务器硬…

定时任务、cron表达式、springBoot整合定时任务和异步任务-59

一&#xff1a;定时任务 1.1 官网地址 http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html 1.2 cron表达式 Cron表达式是一个字符串&#xff0c;字符串以5或6个空格隔开&#xff0c;分为6或7个域&#xff0c;每一个域代表一个含义&am…

【Nacos】一文为你揭露它的强大

注&#xff1a;为什么要使用nacos作为注册中心呢&#xff1f;这样的好处在哪呢&#xff1f;一、 什么是nacosNacos 是 Dynamic Naming and Configuration Service 的首字母简称&#xff1b;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 致力于帮助您…

java 方法看这一篇文章就够了

第一章 方法概念 1实现特定功能的一段代码,可反复被调用计算机 — 模拟现实 — 通过软件控制硬件 比如豆浆机 — 里面的微控制器 — 控制豆浆机 右图面板上有很多种模式 每一种模式对应不同的搅拌次数、搅拌时间、烧水温度等… 这些硬件的动作都需要软件的控制 硬件的每一种模式…

el-table使用sortablejs实现行、列拖拽

效果图 代码如下 <script src"//unpkg.com/sortablejs1.7.0/Sortable.js"></script> <script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <link rel"stylesheet" href"//unpkg.com/eleme…

文件或目录损坏且无法读取?正确恢复文件的4个方法

你有没有遇到过“文件损坏已无法读取”的提示窗口&#xff1f;相信使用电脑的你&#xff0c;或多或少都会遇到过&#xff0c;尤其是我们使用硬盘或者移动硬盘的时候。 遇到这种问题&#xff0c;我们第一时间不是按照系统提示去删除或者格式化&#xff0c;而是要寻找合适的方法…