一个JS版寻路的实现
js版的寻路的测试
20231104_161146
path
get_v8: function (x_inc, y_inc) {if (x_inc == 0) {if (y_inc < 0) {return [[0, -1], [-1, -1], [1, -1], [-1, 0], [1, 0], [-1, 1], [1, 1], [0, 1]];} else if (y_inc > 0) {return [[0, 1], [-1, 1], [1, 1], [-1, 0], [1, 0], [-1, -1], [1, -1], [0, -1]];}}if (y_inc == 0) {if (x_inc < 0) {return [[-1, 0], [-1, -1], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 1], [1, 0]];} else if (x_inc > 0) {return [[1, 0], [1, -1], [1, 1], [0, -1], [0, 1], [-1, -1], [-1, 1], [-1, 0]];}}if ((x_inc == 1) && (y_inc == 1)) {return [[1, 1], [1, 0], [0, 1], [1, -1], [-1, 1], [0, -1], [-1, 0], [-1, -1]];}if ((x_inc == -1) && (y_inc == -1)) {return [[-1, -1], [-1, 0], [0, -1], [-1, 1], [1, -1], [0, 1], [1, 0], [1, 1]];}if ((x_inc == 1) && (y_inc == -1)) {return [[1, -1], [0, -1], [1, 0], [-1, -1], [1, 1], [-1, 0], [0, 1], [-1, 1]];}if ((x_inc == -1) && (y_inc == 1)) {return [[-1, 1], [0, 1], [-1, 0], [1, 1], [-1, -1], [1, 0], [0, -1], [1, -1]];}
},
is_line_path: function (path, i1, i2, map_data) {if (path[i1].col == path[i2].col) {for (var i = i1; i <= i2; i++) {if (map_data.data[path[i].row][path[i1].col] < 1)return false;}return true;}if (path[i1].row == path[i2].row) {for (var i = i1; i <= i2; i++) {if (map_data.data[path[i1].row][path[i].col] < 1)return false;}return true;}return false;
},
smooth_path: function (path, map_data) {for (var k = path.length - 1; k > 0; k--) {var x2 = path[k].col;var y2 = path[k].row;var i_line = -1;for (var i = k - 1; i >= 0; i--) {if ((path[i].col == x2) || (path[i].row == y2)) {if (this.is_line_path(path, i, k, map_data)) {i_line = i;}}}if (i_line >= 0) {if (path[i_line].col == x2) {for (var i = i_line; i <= k; i++) {path[i].col = x2;}}if (path[i_line].row == y2) {for (var i = i_line; i <= k; i++) {path[i].row = y2;}}}}return path;
},
get_path: function (pos1, pos2, map_data) {var pos_from = pos1;var pos_to = this.get_pos_canto(pos2, map_data);var rows = map_data.rows;var cols = map_data.cols;if (map_data.pt) {} else {map_data.pt = [];for (var row = 0; row < rows; row++) {var p = [];for (var col = 0; col < cols; col++) {p.push([0, 0]);}map_data.pt.push(p);}}for (var row = 0; row < rows; row++) {for (var col = 0; col < cols; col++) {if (map_data.data[row][col] >= 1) {map_data.data[row][col] = 1;}}}var v8 = [[-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1]];var v = v8;var pt = [];var x_p;var y_p;var x;var y;var x_inc;var y_inc;var xy;var is_end = false;var pt_tmp = [];pt.push(pos_from);var path = [];map_data.data[pos_from.row][pos_from.col] = 2;map_data.pt[pos_from.row][pos_from.col] = [0, 0];var maxd = Math.sqrt(map_data.cols * map_data.cols + map_data.rows * map_data.rows);for (var d = 3; d < maxd * 8; d++) {pt_tmp = [];for (var i = 0; i < pt.length; i++) {var x_p = pt[i].col;var y_p = pt[i].row;if (x_p <= 0)continue;if (x_p >= cols)continue;if (y_p <= 0)continue;if (y_p >= rows)continue;if (d > 3) {xy = map_data.pt[y_p][x_p];x_inc = x_p - xy[0];y_inc = y_p - xy[1];v = this.get_v8(x_inc, y_inc);}for (k = 0; k < v.length; k++) {x = x_p + v[k][0];y = y_p + v[k][1];if ((map_data.data[y][x] == 1)) {if (map_data.data[y][x] == 1) {pt_tmp.push({ col: x, row: y });}map_data.data[y][x] = d;map_data.pt[y][x][0] = x_pmap_data.pt[y][x][1] = y_p;if ((x == pos_to.col) && (y == pos_to.row)) {var tmp = [];for (var m = 0; m < d; m++) {xy = map_data.pt[y][x];x = xy[0];y = xy[1];if ((x > 0) && (y > 0)) {tmp.push({ col: x, row: y });}else {break;}}path.push(pos_from);for (var m = tmp.length - 1; m >= 0; m--) {path.push(tmp[m]);}path.push(pos_to);is_end = true;break;}}}if (is_end) {break;}}if (is_end) {break;}pt = pt_tmp;}return this.smooth_path(path, map_data);
},
get_pos_canto: function (pos, map_data) {if (map_data.data[pos.row][pos.col] >= 1) {return pos;}var x1 = 0;var x2 = 0;var y1 = 0;var y2 = 0;var maxd = Math.sqrt(map_data.cols * map_data.cols + map_data.rows * map_data.rows);for (var d = 1; d < maxd; d++) {x1 = pos.col - d;x2 = pos.col + d;y1 = pos.row - d;y2 = pos.row + d;if (x1 < 0) x1 = 0;if (x2 >= map_data.cols) x2 = map_data.cols - 1;if (y1 < 0) y1 = 0;if (y2 >= map_data.rows) y2 = map_data.rows - 1;for (var x = x1; x <= x2; x++) {if (map_data.data[y1][x] >= 1)return { col: x, row: y1 }if (map_data.data[y2][x] >= 1)return { col: x, row: y2 }}for (var y = y1; y <= y2; y++) {if (map_data.data[y][x1] >= 1)return { col: x1, row: y }if (map_data.data[y][x2] >= 1)return { col: x2, row: y }}} return null;
}
相关文章:

一个JS版寻路的实现
js版的寻路的测试 20231104_161146 path get_v8: function (x_inc, y_inc) {if (x_inc 0) {if (y_inc < 0) {return [[0, -1], [-1, -1], [1, -1], [-1, 0], [1, 0], [-1, 1], [1, 1], [0, 1]];} else if (y_inc > 0) {return [[0, 1], [-1, 1], [1, 1], [-1, 0], [1, 0…...
Java web应用的目录结构
详情可以参考: https://tomcat.apache.org/tomcat-10.1-doc/appdev/deployment.html https://jakarta.ee/specifications/servlet/6.0/jakarta-servlet-spec-6.0.html#directory-structure Java web应用根目录下包含如下内容: *.html, *.jsp等…...

【Mac环境搭建】JDK安装、多JDK安装与切换
文章目录 JDK下载与安装下载安装 配置环境变量安装多个JDK共存 JDK下载与安装 下载 Oracle官网提供了非常多个版本的JDK供下载,可以点击如下链接重定向到JDK下载页面 ORACLE官网JDK下载 安装 下面的官方文档可以点开收藏到浏览器的收藏夹,这样后续在开…...

C++: 类和对象(中)
文章目录 1. 类的6个默认成员函数2. 构造函数构造函数概念构造函数特性特性1,2,3,4特性5特性6特性7 3. 析构函数析构函数概念析构函数特性特性1,2,3,4特性5特性6 4. 拷贝构造函数拷贝构造函数概念拷贝构造函数特性特性1,2特性3特性4特性5 5. 运算符重载一般运算符重载赋值运算符…...

图片批量归类:告别混乱,实现高效文件管理
在日常生活中,我们经常需要处理大量的图片文件。这些图片可能来自于不同的设备、不同的目录,甚至不同的存储介质。随着时间的推移,这些图片文件会越来越多,管理起来也会越来越困难。如何高效地整理这些图片文件,告别混…...
187. 重复的DNA序列 --力扣 --JAVA
题目 DNA序列 由一系列核苷酸组成,缩写为 A, C, G 和 T.。 例如,"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时,识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次…...

Mysql高级——Mysql8一主一从,多主多从搭建
修改 /etc/hosts文件 ip地址 master1 ip地址 master2 ip地址 slave1 ip地址 slave2一主一从 create database master1db;create table master1db.master1tab(name char(50));insert into master1db.master1tab VALUES(1111);insert into master1db.master1tab VALUES(2222);m…...
【Qt5】QNetworkAccessManager
2023年11月5,周日晚上 QNetworkAccessManager是Qt Network模块中的一个类,用于发送网络请求和接收网络响应。它提供了一种方便的方式来进行网络通信,支持常见的网络协议,如HTTP、HTTPS、FTP等。 QNetworkAccessManager和QNetwork…...

zookeeper节点类型
节点类型 持久节点(Persistent Nodes) 这些是Zookeeper中最常见的一种节点类型,当创建一个持久类型节点时,该值会一直存在zookeeper中,直到被显式删除或被新值覆盖。 临时节点(Ephemeral Nodesÿ…...

【C++】一篇文章搞懂auto关键字及其相关用法!
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

微信小程序overflow-x超出部分样式不渲染
把display:flex改成display:inline-flex, 将对象作为内联块级弹性伸缩盒显示, 类似与是子元素将父元素撑开,样式就显示出来了...
Oracle常用运维SQL-SQL执行性能及锁表等查询分析
oracle相关系列文章: docker–在Anaconda jupyter 容器中使用oracle数据源时,Oracle客户端安装配置及使用示例 Oracle常用运维SQL–用户管理、数据导入、导出的实用脚本 Oracle TEMPORARY TABLE 临时表的使用及删除报ORA-14452错误的解决办法 Oracle常用运维SQL-SQL执行性能及…...

安装MySQL时出现 由于找不到 MSVCR120.dll,无法继续执行代码。重新安装程序可能会解决此问题。
--------------------------- mysqld.exe - 系统错误 --------------------------- 由于找不到 MSVCR120.dll,无法继续执行代码。重新安装程序可能会解决此问题。 --------------------------- 确定 --------------------------- 安装MySQL时出现 “This appl…...

【基础IO⑧】:文件描述符fd(进程与文件的联系)
【基础IO⑧】:进程与文件之间的联系(文件描述符fd) 一.前言探讨[进程与文件关系]二.C语言文件操作三.系统文件调用1.open/write 四.文件描述符fd 一.前言探讨[进程与文件关系] 我们首先了解一些基本的认识: 1.文件包括文件内容和文件属性 2.…...

搭建WAMP网站教程(windows+apache+mysql+php)
之前为了学习网络安全,从搭建网站学起,对网站运行有个初步的了解。 今天翻到了之前的笔记,顺手发到csdn上了。 搭建网站步骤 一、Apache 安装Apache,下载Apache之后把Apache解压,此处解压到C:\目录下 2.然后要记得安…...

瓦斯抽采VR应急救援模拟仿真系统筑牢企业安全生产防线
矿工素质对安全生产的影响很大。传统的煤矿安全事故培训出于条件差、经验少加上侥幸心理,导致其在教学内容时过于简单且不切合实际,无法真正发挥培训作用。瓦斯检查作业VR模拟实操培训通过真实还原煤矿作业环境,让受训者身临其境地进入三维仿…...

nodelist 与 HTMLCollection 的区别
原地址 https://cloud.tencent.com/developer/article/2013289 节点与元素 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点: 整个文档是一个文档节点每个 HTML 元素是元素节点HTML 元素内的文本是文本节点每个 HTML 属性是属性节点注释是注…...

系列十二、过滤器 vs 拦截器
一、过滤器 vs 拦截器 1.1、区别 (1)触发时机不一样,过滤器是在请求进入容器后Servlet之前进行预处理的,请求结束返回也是,是在Servlet处理完后,返回给前端之前; (2)过滤…...
dockerfile运行apk命令卡住的问题解决——更换镜像
在练习docker官方文档关于docker compose初体验(https://docs.docker.com/compose/gettingstarted/)过程中,执行dockerfile命令RUN apk add --no-cache gcc musl-dev linux-headers时,出现卡住的情况,等了几千秒都不行…...

Android - 编译 openssl 踩坑之路
一、简述 如果你想快速在项目中使用上 openssl,可以使用网上其他开发者提供好的预编译库: OpenSSL(All):https://builds.viaduck.org/prebuilts/openssl/OpenSSL(3.1.*) :https://github.com/217heidai/openssl_for_android以上的预编译库可能最低只支持 API 21(即 Andro…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...