canvas识别路线


theme: jzman

视频说明

jvideo

前言

效果一

image.png

技术栈

  • html
  • javascript
  • css
  • canvas

项目主要功能上传一张地图,或者迷宫地图,通过canvas的一系列操作,并指定一个起点和终点,并找到到达终点最近的路线

迷宫找出口效果

image.png

正文

加载图像

首先是加载图像,选择一张图,最好是底色是相同的 或者说底色的色差不是很大,你也可以在网上找一张迷宫的图片

```javascript var imgObj = new Image(); imgObj.src = "../img/floor.jpg";

//待图片加载完后,将其显示在canvas上 imgObj.onload = function () { drawImg(this) } ```

通过new Image构造一个图像,等价于document.createElement("img"),这张图在onload调用后会得到图片的尺寸,和具体的图像信息,创建实例为HTMLImageElement

这样我们就得到了一个图像,接下来就是将图像通过canvas分析,得到每个像素点的色值

获取色值信息

ImageData ctx.getImageData(sx, sy, sw, sh);

getImageData接受的参数一共4个,两个为一组,第一组是获取图片信息的起始点,一般都填写0,0,如果你的图像需要识别切边以后的数据,可以根据实际情况调整,第二组为识别区域的结束图标,通常为图像的宽度和高度。

这就是获取到的图像信息Uint8ClampedArray,由取值范围在0和255之间的无符号整数组成,其中包含了字节长度,和色值。在图像中每个像素用4个1bytes 值(按照红、绿、蓝和透明值的顺序;这就是“RGBA”格式)来代表。

image.png

顺序分别是图像的第一行第一个像素色值到第一行最后一个像素的色值,再从第二行第一个像素色值到最后一个像素的色值,这样Z字形排列,直到最后一行。

行和列的数量我们晓得了,就是图像的宽高,接下来就是遍历Uint8ClampedArray提供的字节信息,得到每一个像素点的色值

```javascript for (let i = 0; i < (pixelData.length / limit); i++) { const r = pixelData[i * limit + 0] const g = pixelData[i * limit + 1] const b = pixelData[i * limit + 2] const diff = distance([r, g, b]) const flag = diff <= colorDeff // 可通行标志 col++ if (i % accuracy === 0) { flagCol++ } if (i % width === 0) { // 折行 col = 0 row++

flagCol = 0
        if (i % accuracy === 0) {
            // flagCol++
            flagRow++ // 数据数组加一行
        }
    }

```

在此之前需要先知道几个常量和方法: 1. distance用来计算两个颜色之间色差的方法, 2. standardColor底色(视为可行走范围的颜色), 3. colorDeff色差范围,像素颜色和规定底色色差小于这个值,则视为可行走范围,而超过这范围视作色差太大, 不符合可行走范围的色值;

在循环中,得到像素点的rgb,通过像素点上的色值,通过distance方法和standardColor对比色差,如果色差小于规定的色差值colorDeff,则被视为可行走路线

标记行走范围

``` typescript if (flag) { if (!runFlag[flagCol] && !runFlag[flagCol] !== 0) runFlag[flagCol] = []; if (!runFlag[flagCol][flagRow] && runFlag[flagCol][flagRow] !== 0) runFlag[flagCol][flagRow] = 1 // drawRect(col, row) } else { if (!runFlag[flagCol]) runFlag[flagCol] = []; if (!runFlag[flagCol][flagRow]) runFlag[flagCol][flagRow] = 0

} if (!points[flagCol]) points[flagCol] = []; if (!points[flagCol][flagRow]) { points[flagCol][flagRow] = { x: col, y: row } } ```

当循环完毕,根据色值对比的flag判断当前像素是否为可通行状态(像素色值和底色色值小于等于色差范围);

当flag为true的时候runFlag数组添加一个为1的标记,如果为false则添加一个为0的标记, 通过计算得到runFlag二维数组数组,

可行走数组.jpg

drawRect(col, row, 2, 2, 'green')方法将可行走的位置在canvas上标记出来:

标记可行走路线.jpg

寻路

有了这些点位,在确定起点和终点的时候后,就可以执行寻路算法了,

首先假定起点为1和3 const start = [1, 3],终点为某处的随机点位 typescript const randomX = getRandomInt(ex / 2, ex) const randomY = getRandomInt(ey / 2, ey) 确定两个点位以后,执行astar算法 typescript if (runFlag) runPoints = astarCreate(start, end, runFlag) console.log(runPoints);

路线图.jpg

寻路算法计算出的可行走路线

非路线上的.jpg

从这种图上可以看到,终点的随机位置为不可通过的点位,这时候可以设置astar的属性 { closest: true } 即可找到目标点位最近的可通过路线。

astar

关于astar的详细介绍可以翻阅历史文章 # Astar算法基础使用——寻路

历史文章

# threejs渲染高级感可视化涡轮模型

# 写一个高德地图巡航功能的小DEMO

# threejs 打造 world.ipanda.com 同款3D首页

源码git地址

canvas-astar

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

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

相关文章

芋道系统springcloud模块启动报错,枚举类不能为空

问题描述&#xff1a; Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-05-10 15:50:15.756 | ERROR 9120 | main [TID: N/A] o.s.b.d.LoggingFailureAnalysisReporter | ************************…

【C++】详细版 RAII技术的应用之智能指针(智能指针发展历程和简单模拟实现介绍)

目录 前言 一、智能指针有什么用&#xff1f; 二、什么是RAII(智能指针的底层思想)&#xff1f; 三、智能指针的发展历程以及模拟实现 1.auyo_ptr&#xff08;C98&#xff09; 2.unique_ptr&#xff08;C11&#xff09; 3.shared_ptr&#xff08;C11&#xff09; 前言 C中…

面向对象 03:类与对象的创建、初始化和使用,通过 new 关键字调用构造方法,以及创建对象过程的内存分析

一、前言 记录时间 [2024-05-10] 系列文章简摘&#xff1a; Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 Java 笔记 11&#xff1a;Java 方法相关内容&#xff0c;方法的设计原则&#xff0c;以及方法的定义和调用 面向对象 01&#xff1a;Java 面向对…

使用com.google.common.collect依赖包中的Lists.transform()方法转换集合对象之后,修改集合中的对象属性,发现不生效

目录 1.1、错误描述 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;模拟代码 &#xff08;3&#xff09;运行结果 1.2、解决方案 1.1、错误描述 最近在开发过程中&#xff0c;使用到了com.google.common.collect依赖包&#xff0c;通过这个依赖包中提供的…

4D 成像毫米波雷达:新型传感器助力自动驾驶

1 感知是自动驾驶的首要环节&#xff0c;高性能传感器必不可少 感知环节负责对侦测、识别、跟踪目标&#xff0c;是自动驾驶实现的第一步。自动驾驶的实现&#xff0c;首先要能够准确理解驾驶环境信息&#xff0c;需要对交通主体、交通信号、环境物体等信息进行有效捕捉&#x…

2024-AIDD-人工智能药物设计-AlphaFold3

AlphaFold3&#xff5c;万字长文解读 AlphaFold3预测所有分子相互作用准确结构 AlphaFold3 自2021年AlphaFold2问世以来&#xff0c;科研工作者们便开始利用这一蛋白结构预测模型来详细描绘众多蛋白质的结构、探索新药。近日&#xff0c;Google DeepMind公司推出了其最新产品…

[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具

石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff0…

《Python编程从入门到实践》day24

# 昨日知识点学习 创建外星人从一个到一行 # 主程序snipdef _create_fleet(self):"""创建外星人群"""# 创建一个外星人并计算一行可容纳多少个外星人# 外星人的间距为外星人的宽度alien Alien(self)alien_width alien.rect.widthavailable_sp…

Android 屏幕适配全攻略(上)-掌握屏幕单位,应对千变万化的设备

本文从 Android 开发中常见的长度单位 px、dp、sp 入手&#xff0c;详细介绍了它们的特点及转换关系。 接着深入探讨了屏幕尺寸、分辨率、像素密度等重要的屏幕指标&#xff0c;帮助读者全面理解它们之间的联系。最后&#xff0c;通过实例代码演示了如何在代码中进行单位转换&…

从头开始的建材类电商小程序开发指南

在当今数字化时代&#xff0c;小程序已经成为了许多企业推广和销售的重要渠道。对于建筑材料行业来说&#xff0c;开发一个属于自己的小程序商城不仅可以提升产品曝光度&#xff0c;还可以提供更好的用户购物体验。下面&#xff0c;我们将逐步教你如何开发建筑材料行业小程序。…

【c++算法篇】双指针(下)

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;算法笔记仓 朋友们大家好啊&#xff0c;本篇文章我们来到算法的双指针的第二部分 目录 1.有效三角形的个数2.查找总价格为目标值的两个商品3.三数之和4.四数之和5.双指针常见场景总结 1.有效三角形…

【Linux】Linux——Centos7安装Nginx

不需要安装包 1.安装依赖 #查看 C 环境是否安装gcc -v #查看 zlib 是否安装cat /usr/lib64/pkgconfig/zlib.pc #查看 pcre 是否安装pcre-config --version 2.安装C #安装C yum install gcc-c 3.安装pcre yum install -y pcre pcre-devel 4.安装zlib #安装 yum install -y zlib…

西米支付:数字藏品元宇宙的介绍与骗局套路解析

一、什么是元宇宙&#xff1f; 元宇宙是一个集体虚拟共享空间&#xff0c;由虚拟增强的物理现实和物理持久的虚拟空间融合而创造&#xff0c;包括所有虚拟世界、增强现实和互联网的总和。简单地说&#xff0c;元宇宙是Web3.0时期的数字世界。 这类新兴概念被非法分子包装后&am…

libssh C++封装之六(Dir)

1 概述 libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh,您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C++封装。 libssh下载地址 3 实现 3.5 Dir Dir类型管理远程路径,通过SFTP和Channel实现(有…

Java入门基础学习笔记14——数据类型转换

类型转换&#xff1a; 1、存在某种类型的变量赋值给另一种类型的变量&#xff1b; 2、存在不同类型的数据一起运算。 自动类型转换&#xff1a; 类型范围小的变量&#xff0c;可以直接赋值给类型范围大的变量。 byte类型赋值给int类型&#xff0c;就是自动类型转换。 pack…

20240503安装HEVC解码器播放H265格式的8K视频

20240503安装HEVC解码器播放H265格式的8K视频 2024/5/3 9:55 缘起&#xff1a;由于youtube支持8K视频了&#xff0c;想尝尝鲜&#xff01; 主摄像头当然是选择SONY的【夜摄/弱光场景】&#xff0c;根据优选&#xff0c;小米&#xff08;MI&#xff09;13Ultra 最佳了。 在开始播…

什么是SOL链跟单机器人与阻击机器人?

SOL链作为一个快速增长的区块链生态系统&#xff0c;为各种应用程序提供了丰富的发展机会。在SOL链上&#xff0c;智能合约的应用已经开始蓬勃发展&#xff0c;其中包括了许多与加密货币交易相关的应用。在本文中&#xff0c;我们将介绍在SOL链上开发的阻击机器人&#xff08;S…

编译适配纯鸿蒙系统的ijkplayer中的ffmpeg库

目前bilibili官方的ijkplayer播放器&#xff0c;是只适配Android和IOS系统的。而华为接下来即将发布纯harmony系统&#xff0c;是否有基于harmony系统的ijkplayer可以使用呢&#xff1f; 鸿蒙版ijkplayer播放器是哪个&#xff0c;如何使用&#xff0c;这个问题&#xff0c;大家…

JVM调优—减少FullGC

背景 最近负责了一个审批流程新项目&#xff0c;带领了几个小伙伴&#xff0c;哼哧哼哧的干了3个月左右&#xff0c;终于在三月底完美上线了&#xff0c;好消息是线上客户用的很丝滑&#xff0c;除了几个非常规的业务提单之外&#xff0c;几乎没有什么大的问题&#xff0c;但是…