图形算法可视化

2023-05-16

最近看了一些和图形、算法可视化相关的文章和代码,挺有意思,于是自己也学着做了些东西。

迷宫生成算法

迷宫小时候玩过,但从来没琢磨过迷宫是怎么设计的,以为就是有人慢慢画出来的。看过网上这篇文章后,才知道,原来还可以随机生成:

Maze Generation - Visualizing Algorithms

自己找了些资料参考,试着实现了几种之后,才慢慢领会到其中的一些原理。

算法中讨论的迷宫满足一个条件:迷宫中任意两点间有且只有一条路径

要随机生成满足这样条件的迷宫,看起来很复杂啊。但是换个思路之后,就发现问题没那么复杂了。

“树”其实就满足这个条件:

  • 所有的枝叶都可以通过树枝、树干连通
  • 由于枝干不交叉,没有环,所以枝叶间连通的路径是唯一的

所以,生成随机的迷宫的问题,就转化为生成随机的树的过程。进一步,可以拆分为以下过程:

  • 在迷宫网格内随机选择一个点作为“树根”
  • 从树根开始,向随机选择的某一方向开始生长
  • 直到树的枝干通过不断生长、分叉充满迷宫的所有网格

迷宫生成的不同算法,区别主要在两点:

  • 从一个位置开始生成后一直向随机方向延伸的最大长度:有的是延伸一个网格后立即更换生长点,有的则是直到无法继续延伸后才更换生长点
  • 更换生长点时选择位置的方式:有的是记录当前枝干经过的网格,依次后退,有的干脆是完全随机选择一个有可能向外生长的点

深度优先算法

深度优先算法,也叫递归回溯算法。它会一直向随机方向生长,直到无法生成的位置,向后回退一格,继续生长,直到所有网格被填充。

深度优先算法生成的迷宫,会有比较明显的长路径,这是因为树在一开始生成的时候,空间比较充裕,会有一些长的枝条产生。

Prim 算法

Prim 算法不会一直沿着一条路径进行探索,而是不断尝试随机的生长点。所以 Prim 算法生成的迷宫,分叉会比较多:

算法实现

综合以上两种算法,我既不希望有过长的路径,也不希望有太多的分叉,所以我采用的思路的尝试沿着一条路径延伸最多一定的长度,然后再随机选择生长点执行相同的过程。

下图是在 40*40 的迷宫网格,每条枝干最多生长15个网格的效果:

这是执行了一段时间之后,迷宫大部分区域已经走过:

这是最后的效果:

项目地址:luobotang/maze 在线DEMO:迷宫生成算法 - luobotang

算法可视化

上面例子中的迷宫生成算法过程,迷宫网格是通过 HTML 的

实现,相邻网格的连通效果,则是借助 CSS 的边框样式。

整个迷宫的所有网格由二维数组表示,每个网格的状态包含是否被访问、与相邻网格的连通情况等。

算法的执行过程由定时器驱动,每次执行一步,从而有动画的效果。

最短路径算法

与图相关的最短路径算法,在生活中应该是有着广泛的应用了吧,从一个位置到另一个位置,借助已有的路网,计算最短的路径。当然,还会因为路况、临时障碍,以及用户的个人偏好而产生不同结果。

对于“图”上,基本要素就是:

  • 节点
  • 边:根据场景的不同,还会有方向、权重属性

Dijkstra 算法

Dijkstra 算法是用于计算最短路径的比较著名的一种算法,早在1956年就发表了。

Dijkstra 算法如果看算法的详细执行过程,有点复杂,但是其基本思路在做过之后会发现,貌似很简单。

已确定 A 到 B 的最短路径,B 与 C 相连,且 A 到 B 的距离加上 B 到 C 的距离,小于当前 A 到 C 的距离,那么 A 到 B 再到 C 就是 A 到 C 的最短路径。

如上图所示,最初从 A 来看,到 C 的最短路径是 A -> C,距离是 4。但继续探索到 B 后,发现 A -> B 加上 B -> C 距离只有 3,比 A -> C 的距离要小,所以 A 到 C 的最短路径更新为:A -> B -> C。

算法实现

基本思路上面都介绍了,细节就是每次探索节点时,都选择当前未探索过的到源点距离最短的节点,这样可以源点到当前点的路径已经是最短路径。

算法可视化

图的可视化比较复杂了,只是绘制出来其实不难,但要将节点、边进行合理布局就比较麻烦,是另一个话题了。

我选择用 vis.js 提供的 Network 来绘制图形,然后通过逐步执行算法来更新图形。

这是初始状态:

执行过程中,会记录节点是否被访问,以及当前的最短路径和对应的距离:

全部执行完成后,就得到了源点开始到图中所有节点的最短路径:

项目地址:luobotang/graph DEMO:Dijkstra 算法 - luobotang

项目的 Github Pages 配置有点问题,只能下载到本地之后再打开页面了。

结语

其实上面这些实现起来并没有特别困难,有很多现成的资料和代码可以利用。但是不管什么饭,都得自己吃过、消化过才是自己的。所以,我把自己吸收的“营养”记录下来,如果你也有兴趣,不妨自己上手一试。

最后,感谢阅读!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图形算法可视化 的相关文章

  • 发表一篇顶会论文的经验分享

    背景 xff1a 最近半个月 xff0c 对之前发表的一篇顶会论文进行了修改 xff0c 并重新提交了 这篇论文是一篇计算机领域的A会文章 本篇文章主要对计算机领域论文写作及发表过程中的相关经验做一个总结 希望可以对研究生小白们有点用 刚刚
  • jQuery的md5加密插件及其它js md5加密代码

    jQuery MD5 hash algorithm function lt code gt Calculate the md5 hash of a String String md5 String str lt code gt Calcul
  • matlab双目相机标定校正_基于双目视觉的无人机避障算法(一)

    讲述在10月到12月所做的所有工作 对于一个无人机自主避障来说 xff0c 存在着以下流程 xff1a 感知 xff1a 障碍物检测 行人检测 目标检测SLAM xff1a 为无人机提供位置估计 xff0c 构建稀疏环境地图路径规划 xff
  • pdf文件显示白色

    主要原因是pdf默认关联应用 xff0c 在版本更替时出现了错误 xff0c 重新给pdf设置一下默认关联应用即可 window10步骤如下 xff1a 1 打开我的电脑 选择计算机 打开设置 2 点 应用 3 选择 默认应用 中的 按文件
  • mysql数据库想要保持固定条数数据的操作

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 限定数据库数据条数 xff1a SELECT FROM 表名 order by 字段 desc limit 条数 这样查询到的是倒数几条数据 xff0c 保证了最新的数据
  • Docker容器的创建、启动、和停止

    1 容器是独立运行的一个或一组应用 xff0c 及他们的运行环境 容器是Docker中的一个重要的概念 2 docker容器的启动有三种方式 a 交互方式 xff0c 基于镜像新建容器并启动 例如我们可以启动一个容器 xff0c 打印出当前
  • 每天一个linux命令(4):mkdir命令

    linux mkdir 命令用来 创建指定的 名称的 目录 xff0c 要求创建目录的用户在当前目录中具有写权限 xff0c 并且指定的目录名不能是当前目录中已有的目录 1 xff0e 命令格式 xff1a mkdir 选项 目录 2 xf
  • ansible报错:Failed to connect to the host via ssh: Permission denied

    原因 xff1a 没有在ansible管理节点 xff08 即安装ansible的节点 xff09 上添加目标节点 xff08 即需要管理的节点 xff09 的ssh认证信息 解决办法 xff1a 1 在管理节点生成公钥 ssh keyge
  • 值传递和引用传递-----函数参数传递的两种方式

    回顾 xff1a 在定义函数时函数括号中的变量名成为形式参数 xff0c 简称形参或虚拟参数 xff1b 在主调函数中调用一个函数时 xff0c 该函数括号中的参数名称为实际参数 xff0c 简称实参 xff0c 实参可以是常量 变量或表达
  • Andriod监听支付宝收款实现个人支付宝支付接口!附安卓App

    首先呢 xff0c 我不会开发安卓App xff0c 这款APP是我在酷安网看到的 xff0c 非常简单的一款APP xff0c 安装后填写我们的后端接口 xff08 用于接收收款通知的 xff09 就可以接收收款通知了 所以就算我们没有这
  • 记一次异常排查过程:druid连接池抛出DataSourceDisableException

    为什么80 的码农都做不了架构师 xff1f gt gt gt 先交待下项目背景 xff0c 项目中有个功能是从mysql中获取数据库信息来创建数据库连接 xff0c 用的连接池是druid xff0c jar包版本是1 0 9 1 异常的
  • 3389、135、137、138、139、445等端口解释和关闭方法

    3389端口 xff1a 在服务器中 xff0c 3389端口的开放是必需的 xff0c 因为任何服务器的管理员如果想很好地管理自己的服务器 xff0c 都需要开启这种方便的网络管理服务 不过3389端口一旦开启 xff0c 必然会引来无数
  • 同一个mock 连续多次调用返回不同结果实现方式

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 同一个mock 连续多次调用返回不同结果实现方式 Mockito when methodCall thenReturn 1x thenReturn 2x thenRetur
  • 特别策划:大学毕业生自主创业分析

    转 特别策划 大学毕业生自主创业分析 本期特别策划以 大学毕业生自主创业 为题 xff0c 主要分为两个部分 xff0c 第一部分对大学毕业生自主创业的分布与特点进行了研究分析 xff0c 第二部分为有意向自主创业的大学生提供建议 PART
  • vscode界面上最左边那一栏不见了

    查看 gt 外观 gt 显示活动栏
  • 论文下载&论文阅读方法(吴恩达教你读论文)

    标题 一 论文下载二 吴恩达读论文方法2 1 主体2 2 Math2 3 Coding 三 职业生涯四 给出的建议五 参考 一 论文下载 Source of paper twitter ML subreddit NIPS ICML ICLR
  • 基于有向距离场(SDF)的地图碰撞系统 | Cocos 技术派第15期

    近日 xff0c ID 为 kx dz 的开发者在 Cocos 中文社区分享了一篇名为 介绍一个基于有向距离场 SDF 的地图碰撞系统 的技术文章 xff0c 获得诸多好评 C姐第一时间联系到了作者 xff0c 在获得转载授权的同时 xff
  • SQL 查询当天,本月,本周的记录

    SELECT FROM 表 WHERE CONVERT Nvarchar dateandtime 111 61 CONVERT Nvarchar GETDATE 111 ORDER BY dateandtime DESC 本月记录 SELE
  • VC查找网页源码指定内容

    查找网页源码 xff0c 这段代码也可以作为获取外网IP xff0c 不过获取外网IP只需要前面一部分就行了 xff0c 把网页源码读到缓冲区就行了 CString SiteInfo SiteName 61 http www ip138 c
  • 笔试之内存分配问题

    需要知道的概念 xff1a 1 程序 xff1a 包括代码和数据 xff0c 是静态的概念 2 进程 xff1a 程序的执行过程 xff0c 是指一个程序中的代码在一个数据集合中的运行过程 xff0c 所以说相同代码在不同的数据集合上运行

随机推荐

  • 计算机视觉基础(三)——对极几何中的基本矩阵F和本质矩阵E

    计算机视觉中 xff0c 尤其是双视图几何中 xff0c 基本矩阵F和本质矩阵E扮演着重要角色 xff0c 今天我们就来简单了解一下它们吧 由于公式比较多 xff0c 所以直接在word中编辑好后整个截图过来了 xff08 参考书目 计算机
  • 使用docker搭建开发环境

    我的主力机是windows windows下面有太多提升效率的软件 但是开发的时候不得不使用linux 就单单开发而言 我还是喜欢使用linux 所以就造成了我得在windows下面使用虚拟机 这是最开始的办法 后面得知有vagrant这个
  • ROS的单线程Spinning和多线程Spinning

    单线程Spinning ros spin 是最简单的单线程自旋 它会一直调用直到结束 用法 ros spin 另一个单线程spinning是ros spinOnce 它定期调用等待在那个点上的所有回调 用法 ros spinOnce 简单的
  • antd 的form 表单怎么回显数据_antd Form表单的initialValue问题

    在initial中是有初始值的 xff0c 但是却不显示初始值 xff0c 请大佬解答一下这个问题 const formItem 61 type 3 label 39 柜子编号 39 name 39 ID 39 width 39 150px
  • echarts 与 highcharts

    一 xff0e 简介 echarts echarts是百度公司前端开发的一个图表库 xff0c 2013年发布第一版 xff0c 主要采用canvas画图 xff0c 目前版本3 8 4 xff1b 完全免费 xff1b highchart
  • c语言不同源文件变量,我在哪里可以在c程序中声明全局变量,无论是在头文件还是源文件中...

    本问题已经有最佳答案 xff0c 请猛点这里访问 嗨 xff0c 我是一个C 43 43 开发者 xff0c 现在我正在做C编程 我的问题是 xff0c 在C程序中 xff0c 哪个地方更好地声明全局变量 头文件或源文件 如果我的全局变量未
  • ***网址大全

    网址大全 最全的 国内 基地 http www hackbase com 帝国 http www darkup com 中国 联盟 http www chinahacker com起点 网络 http www qdhack com 边缘 h
  • 监控硬盘容量计算

    如何快速的计算摄像头一天存储量 摄像机的码流即监控视频流的带宽 xff0c 分为主码流和子码流 xff0c 主码流用来存储 xff0c 子码流一般用来预览 xff0c 所以录像回放时大家看到的视频质量要高于预览时看到的 在不同分辨率 帧率以
  • 【原】Hadoop伪分布模式的安装

    Hadoop伪分布模式的安装 环境参数 1 Host OS xff1a Win7 64bit 2 IDE xff1a Eclipse Version Luna Service Release 2 4 4 2 3 虚拟机 xff1a VMwa
  • 背景建模技术(四):视频分析(VideoAnalysis)模块

    视频分析模块主要包含两个函数 xff0c 一个是VideoAnalysis setup xff08 xff09 xff0c 其主要功能就是确定测试的视频是视频文件或摄像头输入亦或是采用命令行参数 xff1b 第二个函数是VideoAnaly
  • ubuntu 安装docker + seagull实现图形化管理

    环境 xff1a ubuntu 14 04 server 通过Docker源安装最新版本 要安装最新的 Docker 版本 xff0c 首先需要安装 apt transport https 支持 xff0c 之后通过添加源来安装 sudo
  • Ethzasl MSF源码阅读(1):程序入口和主题订阅

    关于IMU融合知乎上的一篇问答 xff1a 有哪些开源项目是关于单目 43 imu做slam的 xff1f Ethz的Stephen Weiss的工作 xff0c 是一个IMU松耦合的方法 1 程序入口 xff1a ethzasl msf
  • 自动化运维的5大好处

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 努力解决企业IT日益增长的运维挑战 xff0c 大多数运维团队面临的最核心问题在于 如何用更少的资源完成更多工作 自动化运维则是这一问题的理想解决方案 xff0c 特别是在
  • UP Board 串口使用心得

    前言 原创文章 xff0c 转载引用务必注明链接 本文使用Markdown写成 xff0c 为获得更好的阅读体验和正常的图片 链接 xff0c 请访问我的博客 xff1a http www cnblogs com sjqlwy p up s
  • [转]Linux守护进程基础

    为什么80 的码农都做不了架构师 xff1f gt gt gt 1 守护进程中涉及到的基本概念 1 1进程组 1 1 1 进程组基本概念 进程组是一个或多个进程的集合 xff0c 可以接收来自同一个终端的各种信号 每运行一个程序或是命令都将
  • Spring Cloud核心组件详解

    转自 xff1a 作者 xff1a 石杉的架构笔记 链接 xff1a https juejin im post 5be13b83f265da6116393fc7 来源 xff1a 掘金 著作权归作者所有 商业转载请联系作者获得授权 xff0
  • unity 3d开发的大型网络游戏

    unity 3d开发的大型网络游戏 一 总结 1 unity的官网 上面应该有游戏列表 2 unity3D是很好的3d游戏引擎 xff0c 也支持2d xff0c 也能做很多画面精良的3A级游戏 3 范围 xff1a 电脑游戏 xff0c
  • 多系统电脑切换系统操作步骤

    1 电脑搜索栏输 msconfig 会出现下图 2 点引导 xff0c 多个系统的话 xff0c 引导这里显示的是多条信息 3 切换系统 在引导框中选中自己要切换的系统 xff0c 然后点击设为默认值 xff0c 再点应用 xff0c 再确
  • STM32标准外设库、 HAL库、LL库

    工作以来一直使用ST的STM32系列芯片 xff0c ST为开发者提供了非常方便的开发库 到目前为止 xff0c 有标准外设库 STD库 HAL库 LL库 三种 前两者都是常用的库 xff0c 后面的LL库是ST最近才添加 xff0c 目前
  • 图形算法可视化

    最近看了一些和图形 算法可视化相关的文章和代码 xff0c 挺有意思 xff0c 于是自己也学着做了些东西 迷宫生成算法 迷宫小时候玩过 xff0c 但从来没琢磨过迷宫是怎么设计的 xff0c 以为就是有人慢慢画出来的 看过网上这篇文章后