一个JS版寻路的实现

news2024/11/27 2:20:06

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;
}

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

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

相关文章

使用合成数据训练语义分割模型

计算机视觉应用现在在各个科技领域无处不在。 这些模型高效且有效&#xff0c;研究人员每年都会尝试新想法。 新的前沿是试图消除深度学习的最大负担&#xff1a;需要大量的标记数据。 正如本文所述&#xff0c;此问题的解决方案是使用合成数据。 从这些研究中获益最多的计算机…

公众号留言功能在哪?教你开通

为什么公众号没有留言功能&#xff1f;从2018年2月开始&#xff0c;新注册的微信公众号取消了留言功能&#xff0c;原因是为了规避一些营销号通过虚假留言骗取读者信任。不过大部分公众号运营者对TX此举感到失望&#xff0c;一方面大片的留言就像店前排队的顾客&#xff0c;能体…

Camtasia2024破解版电脑屏幕录制剪辑软件

屏幕录制剪辑 TechSmith Camtasia for Mac v2021是 TechSmith 公司所开发出一款专业屏幕录像和编辑&#xff0c; Camtasia Studio2024版是由TechSmith公司官方进行汉化推出的最新版本,除2023版以下版本均没有官方汉化。 同时TechSmith公司打击第三方贩卖Camtasia Studio汉化的…

不同VLAN间的通信原理

不同VLAN间的通信原理 VLANaccess口trunk口 不同VLAN间通信原理 首先我们来看看什么是VLAN VLAN VLAN&#xff08;Virtual Local Area Network&#xff09;虚拟局域网&#xff0c;是将一个物理的局域网在逻辑上划分成多个广播域的技术。VLAN技术部署在数据链路层。 VLAN能够隔…

Redis高级数据类型-HyperLogLogBitmap以及使用两种数据类型完成网站数据统计

网站数据统计 定义相关的Redis Key /*** 单日UV*/public static String getUVKey(String date) {return PREFIX_UVSPLITdate;}/*** 记录区间UV* param startData 开始日期* param endDate 结束日期* return*/public static String getUVkey(String startData,String endDate){r…

05 行列式

行列式 面积变化行列式空间定向改变三维空间行列式的计算 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 面积变化 线性变换会使得基向量 i ⃗ \vec{i} i 和 j ⃗ \vec{j} j ​围城的区域面积被缩放。 图1 线性变换可能会使得基向量 i ⃗ \vec{i} i 和 j ⃗ …

webJS基础-----制作一个时间倒计时

1&#xff0c;可以使用以下两个方式制作 方式1&#xff1a;setTimeout ()定时器是在指定的时间后执行某些代码&#xff0c;代码执行一次就会自动停止&#xff1b; 方式2&#xff1a;setInterval ()定时器是按照指定的周期来重复执行某些代码&#xff0c;该定时器不会自动停止…

从 LLM 大模型到 AI Agent 技术演进

▼最近直播超级多&#xff0c;预约保你有收获 近期直播&#xff1a;《基于 LLM 大模型的微调构建AI Agents 案例实践》 —1— LLM 大模型有哪些局限性&#xff1f; 给定一些字或者词&#xff08;称为 token&#xff09;&#xff0c;预测下一个字或者词模型&#xff0c;就是语言…

基于Magma构建灵活、低成本无线接入网

传统蜂窝网络一般基于特定接入技术并针对大规模公共网络设计&#xff0c;无法灵活适配小规模网络以及异构无线技术。本文介绍了Magma在构建低成本异构无线接入方面的探索。原文: Building Flexible, Low-Cost Wireless Access Networks With Magma 摘要 当今仍然有数十亿人受限…

想学计算机编程从什么学起?零基础如何自学计算机编程?中文编程开发语言工具箱之渐变标签组构件

想学计算机编程从什么学起&#xff1f;零基础如何自学计算机编程&#xff1f; 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;…

跨平台联调代码:Windows下VS2022远程连接Linux-protobuf为例

文章目录 Linux上头文件的位置Linux上共享库的位置Linux上配置好环境变量Windows上VS上的设置添加包含目录与库目录设置链接参数-库依赖项设置编译参数更新远程标头管理器代码的书写输出 Linux上头文件的位置 Linux上我的protobuf头文件的位置为&#xff1a; /usr/local/prot…

2023年中国制糖行业研究报告

第一章 行业概况 1.1 定义 制糖行业是指以甘蔗、甜菜等为主要原料&#xff0c;通过一系列的工艺流程&#xff0c;生产糖以及相关副产品的产业。它是食品工业的重要组成部分&#xff0c;为人们日常生活中的甜蜜体验提供了必不可少的物质基础。 主要原料&#xff1a; 制糖行业…

深入剖析:正则表达式的奥秘

简介 正则表达式&#xff08;Regular Expressions&#xff09;是一种强大的文本处理工具&#xff0c;一种用于匹配文本模式的字符串。它由特定的字符和操作符组成&#xff0c;用于定义一个搜索模式。这些搜索模式可以用于文本搜索、替换、验证和提取数据等多种用途。 以下是一…

在搜索引擎中屏蔽csdn

csdn是一个很好的技术博客&#xff0c;里面信息很丰富&#xff0c;我也喜欢在csdn上做技术笔记。 但是CSDN体量太大&#xff0c;文章质量良莠不齐。当在搜索引擎搜索技术问题时&#xff0c;搜索结果中CSDN的内容占比太多&#xff0c;导致难以从其他优秀的博客平台中获取信息。因…

Mac安装VMware

去官网下载一下VMware Download VMware Fusion | VMware | SG 下载完成之后&#xff0c;打开直接闪退&#xff0c;参考这篇文章解决 解决macOS13安装Fusion13闪退的问题-CSDN博客 然后即可成功顺行

linux入门到地狱

linux—001入门 IT圈必备(前端工作者用的比较少) 老旧电脑跑linux不容易卡 我代码没保存windows闪退&#xff0c;僵停(vs2019卡掉线)&#xff0c;重启更新,占用cpu内存服务报错pip各种bug 出来生态环境友好其他的全是bug(bug时间成本超过了windows快捷友好生态) 那就说明wind…

行业安卓主板-基于RK3568/3288/3588的AI视觉秤/云相框/点餐机/明厨亮灶行业解决方案(一)

AI视觉秤 单屏Al秤集成独立NPU&#xff0c;可达0.8Tops算力&#xff0c;令AI运算效率大幅提升&#xff0c;以实现生鲜商品快速准确识别&#xff0c;快速称重打印标签&#xff0c;降低生鲜门店运营成本&#xff0c;缓解高峰期称重排队拥堵的现象&#xff0c;提高称重效率&#…

1、Sentinel基本应用限流规则(1)

Sentinel基本应用&限流规则 1.1 概述与作用 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。缓存、降级和限流是保护微服务系统运行稳定性的三大利器。 缓存&#xff1a;提升系统访问速度和增大系统能处理的容量 降级&#xff1a;当服务出问题或者影…

如何写复盘报告

复盘报告在it公司中是为了在出现事情后&#xff0c;我们更好的回顾事情的前因后果&#xff0c;定位问题&#xff0c;指定解决措施&#xff0c;并且宣导&#xff0c;让这类事情减少发生的概率。那复盘报告一般怎样写合适呢&#xff1f;下来我们就看看&#xff0c; 一、一般会先…