一个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_p
                    map_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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

The service already exists! 安装mysql数据库错误!

当你输入mysql install命令时报The service already exists! 报错的原因是服务已经存在&#xff01; 说明你之前可能已经装过了。 解决方法&#xff1a; 输入sc delete mysql 提示DeleteService 成功,则表示删除成功&#xff0c;你就可以重新输入mysqld install了。 最后显…

CMU/MIT/清华/Umass提出生成式机器人智能体RoboGen

文章目录 导读1. Introduction2. 论文地址3. 项目主页4. 开源地址5. RoboGen Pipeline6. Experimental Results作者介绍Reference 导读 CMU/MIT/清华/Umass提出的全球首个生成式机器人智能体RoboGen&#xff0c;可以无限生成数据&#xff0c;让机器人7*24小时永不停歇地训练。…

Weblogic ssrf漏洞复现

文章目录 一、漏洞描述二、漏洞特征1.查看uddiexplorer应用2.漏洞点 三、漏洞复现1.获取容器内网ip2.VULHUB Weblogic SSRF漏洞 docker中 centos6 无法启动的解决办法3.准备payload4.反弹shell 一、漏洞描述 SSRF 服务端请求伪造(Server-Side Request Forgery),是一种由攻击者…

知乎日报第三周总结

这周主要完成了评论的加载和长评论的展开与收起&#xff0c;同时完善了前面的内容&#xff0c;文章内容cell的滑动刷新改为滑动一个加载一个&#xff0c;这样就更加流畅&#xff1b;还有就是首次点击只先加载当前cell内容&#xff0c;这样就不会卡顿加载过多内容&#xff0c;剩…

17. 机器学习 - 随机森林

Hi&#xff0c;你好。我是茶桁。 我们之前那一节课讲了决策树&#xff0c;说了决策树的优点&#xff0c;也说了其缺点。 决策树实现起来比较简单&#xff0c;解释解释性也比较强。但是它唯一的问题就是不能拟合比较复杂的关系。 后来人们为了解决这个问题&#xff0c;让其能…

Linux CentOS 8(HTTP的配置与管理)

Linux CentOS 8&#xff08;HTTP的配置与管理&#xff09; 目录 一、常见的 HTTP&#xff08;web&#xff09;服务软件二、基本的 Apache httpd 配置三、httpd.conf 配置文件详解案例1 四、配置虚拟主机&#xff08;在一台主机发布多个站点&#xff09;案例2 一、常见的 HTTP&a…

淘宝预定商品收不到尾款通知 - 解决方案

问题 用户在使用淘宝购买预定商品后&#xff0c;待补尾款时&#xff0c;无法收到尾款通知&#xff0c;从而导致错过补齐尾款无法购买预定商品&#xff0c;下文介绍解决方案。 解决方案 进入淘宝后&#xff0c;购买预定商品时&#xff0c;在提交订单页面时&#xff0c;取消勾…

基于单片机的智能饮水机系统

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统设计方案分析2.1 设计功能及性能分析2.2设计方案分析 二、系统的硬件设计3.1 系统设计框图系统软件设计4.1 总体介绍原理图 四、 结论 概要 现在很多学校以及家庭使用的饮水机的功能都是比较单一的&#…

当pytest遇上poium会擦出什么火花

首先&#xff0c;创建一个test_sample/test_demo.py 文件&#xff0c;写入下面三行代码。 def test_bing(page):page.get("https://www.bing.com")assert page.get_title "必应"不要问题 page 从哪里来&#xff0c;打开终端进入test_sample/目录&#xf…

MySQL---搜索引擎

MySQL的存储引擎是什么 MySQL当中数据用各种不同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制&#xff0c;索引技巧 锁定水平&#xff0c;以及最终提供的不同的功能和能力&#xff0c;这些就是我们说的存储引擎。 MySQL存储引擎的功能 1.MySQL将数据存储在文…

软件测试面试最经典的5个问题

软件测试面试灵魂五问&#xff01; 请做一下自我介绍&#xff1f;你为什么从上家公司离职&#xff1f;为什么转行做测试? 你对测试行业的认识&#xff1f;你的期望薪资是多少&#xff1f;最后&#xff0c;你要问我什么&#xff1f; 一、请做一下自我介绍 简历上有的可以一两…

C++ Concurrency in Action 2nd Edition

《C Concurrency in Action - SECOND EDITION》的中文翻译-面圈网 (mianshigee.com) C/C 学习教程源码-C/C源码推荐-面试哥 (mianshigee.com) 作者正是为C11标准引入线程库的C标准委员会成员本人&#xff01;并且本书作者还编写了众多构成C标准的多线程和并发相关的提案、制定…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志&#xff1a; 发现只有JobManager的错误日志出现了如下的…

试利用栈的基本操作写出先序遍历二叉树的非递归形式的算法

试利用栈的基本操作写出先序遍历二叉树的非递归形式的算法 代码思路&#xff1a; 要用栈解决先序遍历&#xff0c;我们首先要知道栈的性质和二叉树先序遍历的规则 栈最基本的就是先进后出 而二叉树先序遍历就是“根左右” 利用这两个性质&#xff0c;我们可以先将根结点入队…

【数智化案例展】领克汽车——火山引擎助力领克汽车数字化营销实践

‍ 火山引擎案例 本项目案例由火山引擎投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 领克汽车是由吉利汽车、沃尔沃汽车和吉利控股集团合资成立的全球新高端品牌。据吉…

SpringBoot + Vue2项目打包部署到服务器后,使用Nginx配置SSL证书,配置访问HTTP协议转HTTPS协议

配置nginx.conf文件&#xff0c;这个文件一般在/etc/nginx/...中&#xff0c;由于每个人的体质不一样&#xff0c;也有可能在别的路径里&#xff0c;自己找找... # 配置工作进程的最大连接数 events {worker_connections 1024; }# 配置HTTP服务 http {# 导入mime.types配置文件…

3D人像手办定制业务再掀热潮,这一次有怎样的革新?(方法篇)

最近&#xff0c;3D真人手办热潮再起&#xff0c;最出圈的一次当属亚运会的3D打印元宇宙体验舱里面各国运动员带火的真人手办定制项目。作为3D技术推广者&#xff0c;博雅仔也在后台接受了很多朋友的询问—— ◆ 技术已经成熟了吗&#xff1f; ◆ 个人定做3D真人手办市场价格…

【CSS】div 盒子居中的常用方法

<body><div class"main"><div class"box"></div></div> </body>绝对定位加 margin: auto; &#xff1a; <style>* {padding: 0;margin: 0;}.main {width: 400px;height: 400px;border: 2px solid #000;positio…

海康Visionmaster-全局触发:使用全局触发功能执行流 程的方法

我们这里以 TCP 通讯为例&#xff0c;视觉作为 TCP 服务端&#xff0c;与视觉交互的第三方设备作为 TCP 客户端。当 TCP 客户端连接上视觉服务端后&#xff0c;客户端发送字符串 T1,视觉执行流程 1&#xff1b; 客户端发送字符串 T2&#xff0c;视觉执行流程 2。 这样的需求我…

apachesolr启动带调试

这里solr.cmd报错&#xff0c;报错原因是java版本问题&#xff0c;后面发现这是因为多个java版本导致读取java_home失败&#xff0c; 那么我们修改solr.cmd中的JAVA_HOME为SOLR_JAVA_HOME IF DEFINED SOLR_JAVA_HOME set "JAVA_HOME%SOLR_JAVA_HOME%"环境变量将SOLR…