如何写一个魔方二维动态还原MATLAB仿真程序

Posted 嗑药的皮皮虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何写一个魔方二维动态还原MATLAB仿真程序相关的知识,希望对你有一定的参考价值。

        之前文章写过一个魔方二维动态还原MATLAB程序,写得不怎么好,过于复杂,现在重新写了一个,用简单的方法编写MATLAB程序。

1、基础知识

了解魔方表示方法:魔方状态字符串,可以看我之前的文章。

了解会用到的MATLAB基础知识:数据类型有char、string、cell、struct,画矩形函数rectangle

2、思路

用一个3X3矩阵存储魔方一个面9个色块的颜色,该面的旋转就是矩阵的旋转。旋转魔方一个面即旋转非中间层时,有5个面动了,即非中间层的21个色块动了,用一个5X5矩阵存储非中间层的21个色块的颜色。

魔方二维展开坐标图如图所示,每个色块都有一个对应的二维坐标(x,y),使用MATLAB自带函数rectangle画54个色块。(x,y)为矩形左下顶点的坐标,w,h分别为矩形宽度和高度,'edgecolor'为矩形边线的颜色,'k'代表黑色。'facecolor'为矩形面的颜色,'red'代表红色。

rectangle('position',[x y w h],'edgecolor','k','facecolor','red');%画正方形

下面程序中fUxy为元胞数组,储存了U面9个色块的坐标,通过索引可以找到对应坐标。cubexy为结构体,储存了所有54个色块的坐标。

fUxy=-1 1,0 1,1 1;-1 0,0 0,1 0;-1 -1,0 -1,1 -1;   
cubexy.('F')=fFxy;

下图为魔方每个色块的索引图,每个面9个色块用3X3的矩阵表示,通过索引找到相应色块。

下面程序中三个变量为结构体数组,如edge_block_index中字段'UF'对应的值为[3 2 1 2],其    中[3 2]为U面色块的索引,[1 2]为F面色块的索引。

edge_block_index=struct('UF',[3 2 1 2],'UR',[2 3 2 1],'UB',[1 2 3 2],'UL',[2 1 2 3],'DF',[1 2 3 2 ],'DR',[2 3 2 3 ],...
                     'DB',[3 2 1 2],'DL',[2 1 2 1],'FR',[2 3 3 2],'FL',[2 1 3 2],'BR',[2 3 1 2],'BL',[2 1 1 2]);%12棱块
corner_block_index=struct('UFR',[3 3 1 3 3 1], 'URB',[1 3 1 1 3 3],'UBL',[1 1 3 1 1 3],'ULF',[3 1 3 3 1 1],...
                      'DRF',[1 3 3 3 3 3],'DFL',[1 1 3 1 3 1],'DLB',[3 1 1 1 1 1],'DBR',[3 3 1 3 1 3]);%8角块
centrol_block_index=struct('U',[2 2],'D',[2 2],'F',[2 2],'B',[2 2],'L',[2 2],'R',[2 2]);%中心块

 

下面程序中字符串矩阵fB存储了B面9个色块的颜色,fB为3X3矩阵。cube为结构体,储存了所有54个色块的颜色

fB=["blue","blue","blue";
    "blue","blue","blue";
    "blue","blue","blue"];
cube.('B')=fB;

使用一个5X5的矩阵temp存储要转动的非中间层上21个色块的颜色,转动非中间层对应旋转temp。MATLAB自带的矩阵旋转函数为rot90(),rot90(temp,1)代表矩阵temp逆时针旋转90度。

temp = 
  5×5 string 数组
    ""            "green"      "yellow "    "magenta"    ""       
    "white"    "magenta"    "blue"       "blue"       "yellow "
    "white"    "magenta"    "white"      "white"      "green"  
    "blue"      "yellow "    "magenta"    "blue"       "white"  
    ""             "red"        "green"      "magenta"    ""       

特别要注意每个非中间层对应哪21个色块。

3、程序操作

程序写在一个.m文件中,包含多个自己写的函数,点击运行就行,按任意键开始动态还原。

right_cube为已经还原好的魔方的魔方状态字符串,error_cube为未还原好的魔方的魔方状态字符串,step为解魔方步骤,我网上找了一个基于TM法的C++编写的解魔方程序,输入的是魔方状态字符串,输出的是解魔方步骤字符串。

right_cube=['UF ';'UR ';'UB ';'UL ';'DF ';'DR ';'DB ';'DL ';'FR ';'FL ';'BR ';'BL ';'UFR';'URB';'UBL';'ULF';'DRF';'DFL';'DLB';'DBR'];%正序
error_cube=['LU ';'LF ';'UF ';'BD ';'LB ';'RU ';'UB ';'FD ';'BR ';'RF ';'RD ';'DL ';'DBR';'BLU';'BDL';'LFU';'URB';'FLD';'FRU';'DRF'];%乱序
step='U1D3F2L3B3F3U1L1D1L2U1F2R3U3B2L2U3F2U1F2L2F2D2L2B2D2L2U2F2U2';%解魔方步骤,自己根据解魔方算法生成的解魔方步骤修改

 下图是取魔方还原过程中的四幅图组成一幅图

4、总结

        本程序可以用来检验解魔方算法生成的解魔方步骤的正确性,自己对着解魔方步骤用手拧魔方容易出错。本程序还可以改编一下用来生成乱序魔方的魔方状态字符串给解魔方算法生成的解魔方步骤,自己对着乱序魔方写魔方状态字符串是很让人头疼的。有了魔方动态还原程序和解魔方程序就无需一个实际的魔方来验证解魔方程序的可靠性。

程序下载地址:(程序包括魔方二维动态还原程序和生成魔方状态字符串程序)

(解压密码:pipixia)https://download.csdn.net/download/qq_42053235/74765774https://download.csdn.net/download/qq_42053235/74765774

QQ:1663558030

原创不易,还请支持一下。 

以上是关于如何写一个魔方二维动态还原MATLAB仿真程序的主要内容,如果未能解决你的问题,请参考以下文章

如何写一个魔方二维动态还原MATLAB仿真程序

魔方二维动态还原过程MATLAB仿真/魔方二维平面展开

基于MATLAB GUI的魔方三维动态还原仿真程序

基于MATLAB GUI的魔方三维动态还原仿真程序

基于MATLAB GUI的魔方三维动态还原仿真程序

打印设备电磁泄露信息提取和还原技术的matlab仿真实现