关键词:魔方还原;魔方二维平面展开

1.魔方基础知识

1.1魔方各面表示

根据魔方各面所处位置将三阶魔方六个面分别用六个大写英文字母进行表示,相应面上的颜色也分别用这六个大写英文字母进行表示。

魔方六个面对应的大写英文字母及颜色

顶面Up

底面Down

前面Front

背面Back

左面Left

右面Right

U D F B L R
白色 黄色 绿色 蓝色 橙色 红色

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.1 cube_init函数

cube_init()函数无输入参数,函数的作用是将未还原的魔方的魔方状态字符串所包括的信息提取到cube_54xy_c结构体变量中,并画出一个未还原的魔方的二维平面展开图。

4.2 cube_rotate函数

cube_rotate(rotate_face,times)函数,两个输入参数一个是需要旋转的魔方面,另一个是旋转次数。函数作用是当执行一个转动魔方的动作,改变需要移动色块的颜色,并更新cube_54xy_c结构体变量。

4.3 cube_show函数

cube_show()函数无输入参数,函数作用是显示cube_54xy_c结构体变量中对应坐标色块的颜色,相当于更新了魔方二维平面展开图。

4.4 cube_main主程序

cube_main就是一个脚步文件,它调用了cube_init.m/cube_rotate.m/cube_show.m这三个函数,运行这个脚步文件就开始魔方二维动态还原。

4.5 结果

只提取了魔方还原过程中的4副图,如下图所示。

取4个过程合成一张图片

2019 a版本MATLAB程序:matlab_cube4.rar_Matlab绘制三阶魔方-其它文档类资源-CSDN下载   创作不易还请支持一下。

QQ联系2530175129

另一种更简便的方法:

http://t.csdn.cn/7uC9G

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

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

    之前文章写过一个魔方二维动态还原MATLAB程序,写得不怎么好,过于复杂,现在重新写了一个,用简单的方法编写MATLAB程序. 1.基础知识 了解魔方表示方法:魔方状态字符串,可以看我之前的文章. 了 ...

  2. 二维有限元方程matlab,有限元法求解二维Poisson方程的MATLAB实现

    有限元法求解二维 Poisson 方程的 MATLAB 实现 陈 莲a ,郭元辉b ,邹叶童a ( 西华师范大学 a. 数学与信息学院; b. 教育信息技术中心,四川南充 6437009) 摘 要: ...

  3. matlab画二维颜色深浅,MATLAB scatter 画二维/三维散点图时 用颜色表示数值大小 colorbar

    https://blog.csdn.net/weixin_39653442/article/details/115813820 https://zhuanlan.zhihu.com/p/4961557 ...

  4. matlab控制倒立摆小车并绘制二维动态效果图

    clc;close all;clear A = [0 1 0 0;0 0 -1.176 0;0 0 0 1;0 0 18.293 0];%设置倒立摆小车控制系统参数 B = [0; 1 ;0;-1.6 ...

  5. 二维粗糙海面matlab,一维导体粗糙海面与二维导体目标的电磁散射仿真方法

    一维导体粗糙海面与二维导体目标的电磁散射仿真方法 [技术领域] [0001] 本发明属于雷达电磁仿真技术领域,具体涉及一维导体粗糙海面与二维导体目电 磁散射仿真方法. [背景技术] [0002] 海面 ...

  6. 微分环节的matlab仿真,典型环节的MATLAB仿真 实验二.doc

    典型环节的MATLAB仿真 实验二 实验六① 典型环节的MATLAB仿真 实验内容 1.按下列各典型环节的传递函数,建立相应的SIMULINK仿真模型,观察并记录其单位阶跃响应波形. ① 比例环节 S ...

  7. 小心陷阱:二维动态内存的不连续性

    void new_test() {int** pp;pp = new int*[10];for(int i=0; i<10; ++i){pp[i] = new int[10];}//pp[0], ...

  8. c语言动态申请函数,C语言用malloc函数申请二维动态数组

    C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { char * p=(char *)malloc(siz ...

  9. 关于两个用于创建和销毁二维动态数组的宏

    两个宏,用来创建和销毁二维动态数组的: #define matrix_allocate(matrix,width,height,TYPE) {\  matrix=new TYPE *[height]; ...

  10. c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...

最新文章

  1. 性能不打折,内存占用减少90%,Facebook提出极致模型压缩方法Quant-Noise
  2. 2021年春季学期-信号与系统-第十一次作业参考答案-第九小题
  3. MyBatis Mapper Demo
  4. Linux下常用日志分析工具
  5. idea 如何隐藏/展示不想看到的文件
  6. perl socket初步
  7. 升级Windows 2003域的唯一DC
  8. 校园网综合布线设计方案
  9. 各纬度气候分布图_气候分布图有纬度
  10. orcale linux卸载,Linux下卸载ORACLE的多种方法(转)
  11. QQ IM架构学习总结
  12. adb通过局域网连接手机
  13. SpringAOP基础以及四种实现方式
  14. 小米手机android程序闪退,小米手机软件闪退是什么原因
  15. [网络] 数字签名和数字证书的原理机制
  16. Ubuntu没有屏幕亮度调节怎么调整屏幕亮度?
  17. 教资高中计算机科目,中学信息技术考试科目
  18. sqldbx mysql 乱码_使用PLSQL Developer和DbVisualizer、SQLDBx查询oracle数据库时出现乱码...
  19. Microsoft Edge 嗯...无法访问此页面解决办法
  20. 电脑开机停在主板logo画面

热门文章

  1. AWB(Attention WaveBlock)
  2. Android源码层修改默认时区
  3. Windows 10操作系统常用快捷键介绍
  4. 吃鸡账号显示连接不了服务器,《绝地求生》“与Steam服务器连接时出现了一个问题”怎么解决...
  5. 代理模式——保护代理(三)
  6. asp长度为4的随机数字写
  7. java基础知识选择题及答案,java面试题库及答案
  8. python读csv文件中文乱码问题简单解决(附python遍历目录下csv文件并输出内容的代码)
  9. 谷歌浏览器打不开的解决方法
  10. 【图解CAN总线】-7-Classic CAN 2.0总线网络“负载率”计算(方法二)