最近比较忙更新频率也慢了下来,今天带来一个比较有趣的可视化,基于prim算法的迷宫生成并用距离生成图片:

我通过各种向量化编程编写了一个迷宫生成函数,由于代码不是很短因此放在最后面展示代码,以下展示如果将最前面的参数进行改变会有啥效果。


代码使用

迷宫生成

迷宫生成就是用的非常简单的prim算法,大体就是不断的在已经开过门的房间四周随机选择紧挨着的房间,直到所有房间被开过。我的代码编写是专门弄了五个矩阵,一个存已经到过的房间,另外四个分别存上下左右打开过的围墙。

如果代码最前面的基础信息设置为:

% 地图基础信息设置
mazeSize=[30,30];
SPos=[2,5];
showMap=true;
showSurf=false;

就意味着绘制30x30个房间,从第二行第五个房间开始开门,展示迷宫但是不展示距离映射。

当然设置其他大小和其他起点也可以:

映射图

将到起点的距离映射为颜色,只需要将前面的showSurf更改为true:

% 地图基础信息设置
mazeSize=[30,30];
SPos=[2,5];
showMap=true;
showSurf=true;

当然如果设置的地图较大,建议将showMap设置为false,不然绘制的太慢了:

mazeSize=[200,200];
SPos=[50,50];
showMap=false;
showSurf=true;

当然如果把74多行的colormap改成其他颜色,比如pink、bone、turbo、colorcube:

当然colormap可以自己设置的更复杂:

% 自定义色带
if 1
Cmap=[89,214,179
140,181,195
177,156,206
241,189,239
215,193,244
178,199,253
140,189,234
145,166,229
106,85,202]./255;
Ci=1:size(Cmap,1);Cq=linspace(1,size(Cmap,1),300);
Cmap=[interp1(Ci,Cmap(:,1),Cq,'linear')',...interp1(Ci,Cmap(:,2),Cq,'linear')',...interp1(Ci,Cmap(:,3),Cq,'linear')'];
colormap(Cmap)
end

多起点

值得一提的是,多个起点也是支持的!!

% 地图基础信息设置
mazeSize=[30,30];
SPos=[2,5;20,15];
showMap=true;
showSurf=true;

依旧可以设置颜色和更大的地图:

当然不建议将大小设置为300x300以上,???什么玩意这么香????嗷原来是我的电脑!!


完整代码

function primMaze
% @author : slandarer
% gzh  : slandarer随笔
% zh    : 已由hikari更名slandarer% 地图基础信息设置
mazeSize=[50,50];
SPos=[2,5];
showMap=true;
showSurf=true;% 初始化可达迷宫及上下左右围墙矩阵
mazeMat=ones(mazeSize);
mazeMat(sub2ind(mazeSize,SPos(:,1),SPos(:,2)))=0;
zerosMat=zeros(mazeSize);
disMat=zeros(mazeSize);
[UMat,DMat,LMat,RMat]=...deal(ones(mazeSize),ones(mazeSize),ones(mazeSize),ones(mazeSize));if showMapwallHdl=drawMap(UMat,DMat,LMat,RMat);
endwhile any(any(mazeMat))% 找到全部已经走到过且周围至少有一个门的房间UMazeMat=zerosMat;UMazeMat(2:end,:)=mazeMat(1:end-1,:);DMazeMat=zerosMat;DMazeMat(1:end-1,:)=mazeMat(2:end,:);LMazeMat=zerosMat;LMazeMat(:,2:end)=mazeMat(:,1:end-1);RMazeMat=zerosMat;RMazeMat(:,1:end-1)=mazeMat(:,2:end);maze4Mat=UMazeMat+DMazeMat+LMazeMat+RMazeMat;[acRow,acCol]=find(mazeMat==0&maze4Mat>0);% 随机选择一个当前已经走到过的房间tempInd=randi(size(acRow,1),[1,1]);tempRow=acRow(tempInd);tempCol=acCol(tempInd);% 删掉地图外房间位置和不可达房间位置nextPos=[tempRow,tempCol]+[-1,0;1,0;0,-1;0,1];nextPos(nextPos(:,1)<1,:)=[];nextPos(nextPos(:,2)<1,:)=[];nextPos(nextPos(:,1)>mazeSize(1),:)=[];nextPos(nextPos(:,2)>mazeSize(2),:)=[];nextBool=mazeMat(sub2ind(mazeSize,nextPos(:,1),nextPos(:,2)))>0;nextPos=nextPos(nextBool,:);% 随机选择下一个房间nextInd=randi(size(nextPos,1),[1,1]);nextRow=nextPos(nextInd,1);nextCol=nextPos(nextInd,2);mazeMat(nextRow,nextCol)=0;disMat(nextRow,nextCol)=disMat(tempRow,tempCol)+1;% 打破墙壁switch truecase isequal([nextRow,nextCol]-[tempRow,tempCol],[-1,0])UMat(tempRow,tempCol)=0;DMat(nextRow,nextCol)=0;case isequal([nextRow,nextCol]-[tempRow,tempCol],[1,0])DMat(tempRow,tempCol)=0;UMat(nextRow,nextCol)=0;case isequal([nextRow,nextCol]-[tempRow,tempCol],[0,-1])LMat(tempRow,tempCol)=0;RMat(nextRow,nextCol)=0;case isequal([nextRow,nextCol]-[tempRow,tempCol],[0,1])RMat(tempRow,tempCol)=0;LMat(nextRow,nextCol)=0;end% 用来显示地迷宫的代码if showMaprefreshMap(wallHdl,UMat,DMat,LMat,RMat)drawnowend
end
% =========================================================================
% 绘制颜色映射图
if showSurf
sax=gca;hold on
[sM,sN]=size(UMat);
sax.XLim=[0,sN]+.5;
sax.YLim=[0,sM]+.5;
sax.DataAspectRatio=[1,1,1];
surf(flipud(disMat),'EdgeColor','none')
colormap(pink)% 自定义色带
if 0
Cmap=[89,214,179
140,181,195
177,156,206
241,189,239
215,193,244
178,199,253
140,189,234
145,166,229
106,85,202]./255;
Ci=1:size(Cmap,1);Cq=linspace(1,size(Cmap,1),300);
Cmap=[interp1(Ci,Cmap(:,1),Cq,'linear')',...interp1(Ci,Cmap(:,2),Cq,'linear')',...interp1(Ci,Cmap(:,3),Cq,'linear')'];
colormap(Cmap)
end
end
% =========================================================================
% CODE: test drawMap
% UMat(2,3)=0;
% DMat(1,3)=0;
% drawMap(UMat,DMat,LMat,RMat)function wallHdl=drawMap(UMat,DMat,LMat,RMat)ax=gca;hold on[M,N]=size(UMat);ax.XLim=[0,N]+.5;ax.YLim=[0,M]+.5;ax.DataAspectRatio=[1,1,1];% 绘制上方围墙[Y,X]=find(UMat);Y=M+1-Y;X=[X.'+[.5;-.5];nan.*(ones(1,length(X)))];Y=[Y.'+[.5;.5];nan.*(ones(1,length(Y)))];wallHdl{1}=plot(X(:),Y(:),'LineWidth',1,'Color','k');% 绘制下方围墙[Y,X]=find(DMat);Y=M+1-Y;X=[X.'+[.5;-.5];nan.*(ones(1,length(X)))];Y=[Y.'+[-.5;-.5];nan.*(ones(1,length(Y)))];wallHdl{2}=plot(X(:),Y(:),'LineWidth',1,'Color','k');% 绘制左侧围墙[Y,X]=find(LMat);Y=M+1-Y;X=[X.'+[-.5;-.5];nan.*(ones(1,length(X)))];Y=[Y.'+[.5;-.5];nan.*(ones(1,length(Y)))];wallHdl{3}=plot(X(:),Y(:),'LineWidth',1,'Color','k');% 绘制右侧围墙[Y,X]=find(RMat);Y=M+1-Y;X=[X.'+[.5;.5];nan.*(ones(1,length(X)))];Y=[Y.'+[.5;-.5];nan.*(ones(1,length(Y)))];wallHdl{4}=plot(X(:),Y(:),'LineWidth',1,'Color','k');end
% -------------------------------------------------------------------------function refreshMap(wallHdl,UMat,DMat,LMat,RMat)[M,~]=size(UMat);% 绘制上方围墙[Y,X]=find(UMat);Y=M+1-Y;X=[X.'+[.5;-.5];nan.*(ones(1,length(X)))];Y=[Y.'+[.5;.5];nan.*(ones(1,length(Y)))];wallHdl{1}.XData=X(:);wallHdl{1}.YData=Y(:);% 绘制下方围墙[Y,X]=find(DMat);Y=M+1-Y;X=[X.'+[.5;-.5];nan.*(ones(1,length(X)))];Y=[Y.'+[-.5;-.5];nan.*(ones(1,length(Y)))];wallHdl{2}.XData=X(:);wallHdl{2}.YData=Y(:);% 绘制左侧围墙[Y,X]=find(LMat);Y=M+1-Y;X=[X.'+[-.5;-.5];nan.*(ones(1,length(X)))];Y=[Y.'+[.5;-.5];nan.*(ones(1,length(Y)))];wallHdl{3}.XData=X(:);wallHdl{3}.YData=Y(:);% 绘制右侧围墙[Y,X]=find(RMat);Y=M+1-Y;X=[X.'+[.5;.5];nan.*(ones(1,length(X)))];Y=[Y.'+[.5;-.5];nan.*(ones(1,length(Y)))];wallHdl{4}.XData=X(:);wallHdl{4}.YData=Y(:);end
end

MATLAB | prim算法迷宫生成及其艺术渲染相关推荐

  1. Prim算法生成迷宫

    初始化地图 function initMaze(r,c){let row = new Array(2 * r + 1)for(let i = 0; i < row.length; i++){le ...

  2. [迷宫中的算法实践]迷宫生成算法——Prim算法

    普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)), ...

  3. C 语言 随机prim算法 生成迷宫

    使用 随机prim算法生成迷宫,效果如下: 随机prim迷宫生成算法思想: 1.普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不 ...

  4. prim算法_自动生成随机迷宫(1)prim算法

          "程序 = 数据  + 算法",一款好的作品不单单是代码的堆砌,还有其灵魂的部分,那就是算法:算法是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  5. c语言随机prim算法的迷宫生成,Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

  6. Python Prim 算法 生成迷宫

    之前,我们在另外一篇文章中使用Prim算法生成了一个完美迷宫,利用的是遍历网格的方法,这一次,我们要教教大家用遍历墙的方法生成,上一篇文章链接:Python Prim 算法 生成迷宫_Leleprog ...

  7. 随机Prim算法生成迷宫

    前言 以前写过一篇博客,用栈走迷宫,然后就想着自己生成迷宫,自己走,就上网查了查自动生成迷宫的算法,也是研究了好一会,才用代码实现了这个算法,采用的就是常见的随机Prim算法. 原理 参考博客:htt ...

  8. 实验三、prim算法生成迷宫,A*算法解迷宫(实验准备)

    目录 实验要求: 算法简介: prim算法: A*算法: 实验要求: 该项目的主要要求是:首先生成一个迷宫,要求随机生成.而生成迷宫有深度优先算法.prim算法.递归分割算法等.老师说建议使用prim ...

  9. 迷宫生成算法(二)(C++)

    二.最小生成树算法之Prim算法 数据结构中的Prim算法是先将一个顶点加入集合,寻找与其最近的顶点加入集合,然后依次寻找与这两个顶点中最近的顶点加入集合,以此类推直到所有顶点都被访问到. 由于迷宫中 ...

最新文章

  1. python登录网页账号密码_python03网页用户名密码登录
  2. GC详解及Minor GC和Full GC触发条件总结
  3. boost::mp11::mp_min相关用法的测试程序
  4. ITK:分段线性曲线的数据结构
  5. 转:“401 - 未授权:由于凭据无效,访问被拒绝”在iis的解决办法
  6. 星巴克REST案例分析读后感
  7. 手机进程设置多少个最好_安卓手机难逃卡顿宿命?打开4个系统设置,秒变新机般流畅...
  8. Apple Music成为全球第二大音乐流媒体服务 远落后Spotify
  9. powershell_PowerShell图表功能概述
  10. 《一秒学会C++》异步回调函数(C++11)
  11. cf显示网络连接服务器失败怎么办,cf连接服务器失败怎么办
  12. 物理 常见力与牛顿三定律
  13. 卧槽!全网最全编程学习网站汇总!还不赶快放到收藏夹里吃灰~
  14. java垃圾收集方法_Java垃圾收集算法简介
  15. 全新型号 Dell EMC PowerEdge R750xa机架式服务器 全新型号2U
  16. etc/xinetd.d目录介绍
  17. 安全管家安卓_安卓手机自带的管家好,还是另外获取的管家好呢?这4点你要知道...
  18. 利用区块链技术解决传统物流贸易金融诸多痛点
  19. Proteus VSM Studio汇编 + 8位数码管时钟按键可调
  20. 【网络教程】青龙面板常用命令汇总

热门文章

  1. 软件测试周刊(第03期):质量回溯、自动验证埋点、故障度量指标、产品质量指标
  2. Gemini 深度研报 |一个强大的跨链交易系统 Injective
  3. CAD渲染如何选择合适的电脑配置?
  4. influxdb导出csv格式数据
  5. 大连雅思培训百家外语国际部雅思写作中词汇应用的技巧
  6. 企业呼叫中心外包服务市场现状研究分析-
  7. 快来直播:互联网活动运营的14个步骤(上篇)
  8. 推特用户飙升;酷狗基于华为鸿蒙系统开发新应用;苹果新专利 可用手势操控车辆 | 每日大事件...
  9. oracle历史库架构,oracle体系结构
  10. mysql怎么安装安全补丁_MySQL 安装与安全优化