关键词:魔方还原;魔方二维平面展开
1.魔方基础知识
1.1魔方各面表示
根据魔方各面所处位置将三阶魔方六个面分别用六个大写英文字母进行表示,相应面上的颜色也分别用这六个大写英文字母进行表示。
1.2 组成魔方的小方块
一个三阶魔方可分为三层,顶层、底层和中间层。有六个面,每个面9个色块,一共54个色块。总共由26个小方块组成,根据魔方每个小方块所处的位置可分为三种小方块,分别是中心块、棱块和角块。中心块有6个,每个中心块上只有一种颜色,只需用一个大写字母表示,魔方在旋转过程中中心块的相对位置都是不会变的。棱块有12个,棱块处于每条边的中间位置,每个棱块有两种颜色,用两个大写字母表示。角块有8个,每个角块3种颜色,用三个大写字母表示。
1.3 魔方状态字符串
可以用一串大写英文字母表示一个三阶魔方的状态,一个已经还原好的魔方可以用这样一串字符表示:UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR。
这种表示法是由一个叫Mike Reid的魔方爱好者首先使用的,它表示一个已经被解好的魔方。因为六个不同颜色中心块在任何旋转过程中相对位置都是不会变的,所以没有单个字符。这串标准字符中12个双字符表示魔方的12个棱块,每个棱块两种颜色。8个三字符表示魔方8个角块,每个角块三种颜色。对照这个标准字符串,一个打乱的魔方的两个中心块所夹的棱块可以表示出来,三个中心块所夹的角块可以表示出来。
还不理解的朋友看这篇博客:解魔方的机器人攻略18 – 魔方快速算法 at 做做AI,造造人 - 动力老男孩的博客
1.4 拧魔方动作表示/解魔方步骤字符串
拧魔方的动作用各个魔方面代表的字符加顺时针旋转的次数表示,如R1表示R面即右面顺时针旋转一次,R2表示R面顺时针旋转两次,R3代表R面顺时针旋转三次,也即逆时针旋转1次。
解魔方步骤字符串:U1D3F2L3B3F3U1L1D1L2U1F2R3U3B2L2U3F2U1F2L2F2D2L2B2D2L2U2F2U2
2.解魔方算法
本人使用的是Thislethwaite法又简称TM法。网上找了一个基于TM法的C++编写的解魔方程序,输入的是魔方状态字符串,输出的是解魔方步骤字符串。
想获得C++编写的解魔方程序看我的这篇文章:解魔方算法/Thislethwaite解魔方算法/降群法_嗑药的皮皮虾的博客-CSDN博客_魔方降群法
TM法最初是计算机用来解魔方所用的方法。过程中只是在调整块与块之间的全局关系,魔方始终是乱的,没有一个面被还原,只在最后一步,寥寥几下转动,整个魔方被复原。普通解法是通过逐块逐层还原来减少下一步剩余块的状态数,最后所有块还原。TM法则与普通解法有本质的不同。魔方的任何一种状态与魔方群的一个群元素是一一对应的。TM法的思想就是逐步降解魔方所处的群到更小的子群,最后到单位子群,也即还原状态。在还原的每一步实体魔方看起来还是乱的,但实际上魔方的状态数是随所处的群的减小而规则的减小的。
3.魔方二维动态还原MATLAB程序思路
将魔方二维平面展开,U面中心块设为坐标原点(0,0),使用库函数rectangle画魔方色块。
rectangle('position',[x y w h],'edgecolor','k','facecolor',[r g b]);%画方框
使用了很多结构体类型的数据,layer_xy即为结构体类型,layer_xy.('U')存储了U面所在层的20个色块的坐标(不计中心块),即转动U面会移动的色块。坐标分5行,每行4个坐标(x,y)。这样分类的原因与魔方旋转过程中色块的移动有关。有4个色块移动时会到对方位置上去。看图中相同颜色色块所示。
layer_xy.('U')=[0 1 1 0 0 -1 -1 0;-1 1 1 1 1 -1 -1 -1;0 2 2 0 0 -2 -2 0;1 2 2 -1 -1 -2 -2 1;-1 2 2 1 1 -2 -2 -1];
很重要的一个变量就是cube_54xy_c.([x,y]),cube_54xy_c为结构体变量,字段为坐标(x,y),值为颜色RGB值[r g b],即cube_54xy_c.([x,y])=[r g b]。这个结构体变量记录了对应坐标色块的颜色。
4.MATLAB程序
编写了4个.m文件,cube_init.m/cube_rotate.m/cube_show.m这三个为函数文件,cube_main.m为脚步文件,cube_main.m脚步文件调用这三个函数。
使用时需要修改的地方有cube_init()函数中的未还原魔方的魔方状态字符串error_cube字符串数组和cube_main.m中的解魔方步骤step字符数组。修改完成点击运行即可。命令行窗口会显示‘一共多少步’,按任意键就开始二维仿真还原魔方的过程。
4.1cube_init函数
cube_init()函数无输入参数,函数的作用是将未还原的魔方的魔方状态字符串所包括的信息提取到cube_54xy_c结构体变量中,并画出一个未还原的魔方的二维平面展开图。
4.2cube_rotate函数
cube_rotate(rotate_face,times)函数,两个输入参数一个是需要旋转的魔方面,另一个是旋转次数。函数作用是当执行一个转动魔方的动作,改变需要移动色块的颜色,并更新cube_54xy_c结构体变量。
4.3cube_show函数
cube_show()函数无输入参数,函数作用是显示cube_54xy_c结构体变量中对应坐标色块的颜色,相当于更新了魔方二维平面展开图。
4.4cube_main主程序
cube_main就是一个脚步文件,它调用了cube_init.m/cube_rotate.m/cube_show.m这三个函数,运行这个脚步文件就开始魔方二维动态还原。
4.5 结果
只提取了魔方还原过程中的4副图,如下图所示。
a版本MATLAB程序:matlab_cube4.rar_Matlab绘制三阶魔方-其它文档类资源-CSDN下载 创作不易还请支持一下。
QQ联系2530175129
另一种更简便的方法:
/7uC9G