对于魔方的表示:

先看一串天书般的字母:UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR
这种表示法是由一个叫Mike Reid的兄弟首先使用的,它表示一个已经被解好的魔方。
先不要被这串字母吓倒,看算法就像追mm一样,要迎难而上。仔细观察,你会发现其中只有六种字母:
U: Up
F: Front
R: Right
L: Left
D: Down
B: Back
其实这就是代表了空间坐标系的六个方向,就是传说中的“眼观六路”的那六路。
表示法中包含了12组双字母的组合,分别代表了魔方的12个棱,第一组UF就表示Up和Front之间夹角的棱。
另外还包含了8组三字母的组合,分别代表了魔方的8个角,每个角由三块颜色组成。看下面的示意图:

利用MATLAB可以对任意阶魔方进行立体建模和旋转操作,在此基础上可以实现魔方解算程序的仿真和开发,程序以及运行结果如下:

clc;clear;
close all;
x=[-0.5 +0.5 +0.5 -0.5 -0.5 -0.5;
    +0.5 +0.5 -0.5 -0.5 +0.5 +0.5;
    +0.5 +0.5 -0.5 -0.5 +0.5 +0.5;
    -0.5 +0.5 +0.5 -0.5 -0.5 -0.5];
y=[-0.5 -0.5 +0.5 -0.5 -0.5 -0.5;
    -0.5 +0.5 +0.5 +0.5 -0.5 -0.5;
    -0.5 +0.5 +0.5 +0.5 +0.5 +0.5;
    -0.5 -0.5 +0.5 -0.5 +0.5 +0.5];
z=[0 0 0 0 0 1;
    0 0 0 0 0 1;
    1 1 1 1 0 1;
    1 1 1 1 0 1];
Orgcell1=[1 0 1 0 1 1];
Orgcell2=[0 0 0.46 1 1 1];
Orgcell3=[0 1 0 0 0 1];
Org1(:,1)=Orgcell1;
Org2(:,1)=Orgcell2;
Org3(:,1)=Orgcell3;
x1=ones(size(x))+x;
y1=ones(size(x))+y;
x2=-1*ones(size(x))+x;
y2=-1*ones(size(x))+y;
z1=ones(size(z))+z;
z2=-1*ones(size(z))+z;
Org(1,:,:)=[Org1 Org2 Org3 ];
Org(2,:,:)=[Org1 Org2 Org3 ];
Org(3,:,:)=[Org1 Org2 Org3 ];
Org(4,:,:)=[Org1 Org2 Org3 ];
 
h.h0=patch(x2,y1,z, Org);
axis equal tight  
axis([-4 4 -4 4 -4 4]);
hold on; 
h.h1=patch(x,y1,z, Org);
h.h2=patch(x1,y1,z, Org);
h.h3=patch(x2,y,z, Org);
h.h4=patch(x,y,z, Org);
h.h5=patch(x1,y,z, Org);
h.h6=patch(x2,y2,z, Org);
h.h7=patch(x,y2,z, Org);
h.h8=patch(x1,y2,z, Org);

h.h10=patch(x2,y1,z1, Org);
h.h11=patch(x,y1,z1, Org);
h.h12=patch(x1,y1,z1, Org);
h.h13=patch(x2,y,z1, Org);
h.h14=patch(x,y,z1, Org);
h.h15=patch(x1,y,z1, Org);
h.h16=patch(x2,y2,z1, Org);
h.h17=patch(x,y2,z1, Org);
h.h18=patch(x1,y2,z1, Org);

h.h20=patch(x2,y1,z2, Org);
h.h21=patch(x,y1,z2, Org); 
h.h22=patch(x1,y1,z2, Org);
h.h23=patch(x2,y,z2, Org);
h.h24=patch(x,y,z2, Org);
h.h25=patch(x1,y,z2, Org);
h.h26=patch(x2,y2,z2, Org);
h.h27=patch(x,y2,z2, Org);
h.h28=patch(x1,y2,z2, Org);
hold off; 
title('Rubic Cube');
xlabel('Variable X');
ylabel('Variable Y');
zlabel('Variable Z');
grid on;
%view(0,0);   
    origin=[0 0 0.5];
    direct1=[0 1 0];      
    direct2=[0 0 1];      
    direct3=[0 0 1];      
    direct4=[1 0 0];      
    direct5=[1 0 0];      
    direct6=[0 1 0];
    direct=[direct1;direct2;direct3;direct4;direct5;direct6];
    theta1=45;
    theta2=45;
    theta3=-45;
    theta4=-45;
    theta5=45;
    theta6=-45;
    theta=2*[theta1,theta2,theta3,theta4,theta5,theta6];
    H.H1=[h.h6  h.h7  h.h8;         %H1为红色面         
        h.h16 h.h17 h.h18;
        h.h26 h.h27 h.h28]; 
    H.H2=[h.h20 h.h21  h.h22;       %H2为黄色面
        h.h23 h.h24  h.h25;
        h.h26 h.h27  h.h28]; 
    H.H3=[h.h10 h.h11  h.h12;       %H3为白色面
        h.h13 h.h14  h.h15;
        h.h16 h.h17  h.h18]; 
    H.H4=[h.h2  h.h5   h.h8;       %H4为蓝色面
        h.h12 h.h15  h.h18;
        h.h22 h.h25  h.h28]; 
    H.H5=[h.h0  h.h3   h.h6;       %H5为绿色面
        h.h10 h.h13  h.h16;
        h.h20 h.h23  h.h26]; 
    H.H6=[h.h0  h.h1   h.h2;       %H6为橙色面
        h.h10 h.h11  h.h12;
        h.h20 h.h21  h.h22];
for i=0:23
    [H,h]=CubicRotate(H,h,direct,theta,origin,mod(i,6)+1);

end

function [H,h]=CubicRotate(H,h,direct,theta,origin,surface)
switch surface
    case 1
        Handle=H.H1;
    case 2
        Handle=H.H2;
    case 3
        Handle=H.H3;
    case 4
        Handle=H.H4;
    case 5
        Handle=H.H5;
    case 6
        Handle=H.H6;
end

for i=1:10
    rotate(Handle,direct(surface,:),theta(surface)/10,origin);
    pause(0.01);
end
[H,h]=RotateConvert(H,h,surface);

由于从学校毕业好几年,这几年忙于创业,Blog也没怎么关注,现更新下大家关注的RotateConvert函数:

function [H,h]=RotateConvert(H,h,rotateMode)
hOri=h;
switch rotateMode
    case 0
        
    case 1
        h.h16=hOri.h26;
        h.h17=hOri.h6;
        h.h18=hOri.h16;
        h.h8=hOri.h17;
        h.h28=hOri.h18;
        h.h27=hOri.h8;
        h.h26=hOri.h28;
        h.h6=hOri.h27;
    case 2
        h.h20=hOri.h22;
        h.h23=hOri.h21;
        h.h26=hOri.h20;
        h.h27=hOri.h23;
        h.h28=hOri.h26;
        h.h25=hOri.h27;
        h.h22=hOri.h28;
        h.h21=hOri.h25;
    case 3
        h.h10=hOri.h16;
        h.h11=hOri.h13;
        h.h12=hOri.h10;
        h.h15=hOri.h11;
        h.h18=hOri.h12;
        h.h17=hOri.h15;
        h.h16=hOri.h18;
        h.h13=hOri.h17;
    case 4
        h.h18=hOri.h28;
        h.h15=hOri.h8;
        h.h12=hOri.h18;
        h.h2=hOri.h15;
        h.h22=hOri.h12;
        h.h25=hOri.h2;
        h.h28=hOri.h22;
        h.h8=hOri.h25;
    case 5
        h.h10=hOri.h20;
        h.h13=hOri.h0;
        h.h16=hOri.h10;
        h.h6=hOri.h13;
        h.h26=hOri.h16;
        h.h23=hOri.h6;
        h.h20=hOri.h26;
        h.h0=hOri.h23;
    case 6
        h.h0=hOri.h11;
        h.h10=hOri.h12;
        h.h20=hOri.h10;
        h.h21=hOri.h0;
        h.h22=hOri.h20;
        h.h2=hOri.h21;
        h.h12=hOri.h22;
        h.h11=hOri.h2;
end
H.H1=[h.h6  h.h7  h.h8;         
    h.h16 h.h17 h.h18;
    h.h26 h.h27 h.h28]; 
H.H2=[h.h20 h.h21  h.h22;
    h.h23 h.h24  h.h25;
    h.h26 h.h27  h.h28]; 
H.H3=[h.h10 h.h11  h.h12;
    h.h13 h.h14  h.h15;
    h.h16 h.h17  h.h18]; 
H.H4=[h.h2  h.h5   h.h8;
    h.h12 h.h15  h.h18;
    h.h22 h.h25  h.h28]; 
H.H5=[h.h0  h.h3   h.h6;
    h.h10 h.h13  h.h16;
    h.h20 h.h23  h.h26];
H.H6=[h.h0  h.h1   h.h2;
    h.h10 h.h11  h.h12;
    h.h20 h.h21  h.h22];

MATLAB对三阶魔方建模并进行旋转操作相关推荐

  1. matlab 绘制三阶魔方-动态变化

    三阶魔方绘制-动态变化 魔方绘制 魔方绘制可以参考链接: [手把手制作三阶魔方模拟器]用MATLAB绘制一个三阶魔方和 [手把手制作三阶魔方模拟器]用MATLAB让你的魔方动起来. 可以达到的效果为: ...

  2. FPGA虚拟三阶魔方(HDMI显示版)

    目录 ​编辑 一.设计概述 二.设计模块 1.三阶魔方建模 (1)魔方基本操作: (2)魔方建模: 2.魔方转动控制: (1)控制概述: (2)按键消抖: (3)魔方控制: 3.HDMI显示模块: ( ...

  3. 【手把手制作三阶魔方模拟器】用MATLAB让你的魔方动起来

    [手把手制作三阶魔方模拟器]用MATLAB让你的魔方动起来 1 定义魔方初始状态 2 操作模块 2.1 全操作定义 2.2 旋转公式小函数 2.3操作识别 3 显示模块 3.1 初始化 3.2 显示操 ...

  4. 三阶魔方自动求解及动态可视化matlab代码

    三阶魔方自动求解及动态可视化matlab代码 思路与步骤 总结 思考 参考链接 源代码 第一次写博客,想总结分享下以前做过的一些有趣的东西,目的是为了回望过去与展望未来,同时为了提高自己的写作表达能力 ...

  5. 虚拟魔方——使用python对普通三阶魔方进行建模

    使用python对普通三阶魔方进行建模 1 整体构想 1.1 建立虚拟魔方 1.1.1 为魔方的26个方块进行定义 1.1.2 利用图形化方式表示魔方 1.2 对魔方进行操作 1.3 实现对魔方公式的 ...

  6. 【手把手制作三阶魔方模拟器】用MATLAB绘制一个一阶魔方

    [手把手制作三阶魔方模拟器]用MATLAB绘制一个一阶魔方 在三维空间绘制一个正方形 在三维空间绘制一个正六面体 其他 by 今天不飞了 有一个酷爱魔方的朋友,托我给他定制一个专门用于"训练 ...

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

    软件MATLAB R2019A 1.程序介绍 使用MATLAB GUI功能设计制作一个魔方三维动态还原仿真程序,点击魔方旋转按钮U\D\F\B\L\R旋转方面相应面,逆\顺时针按钮切换旋转方向,文字编 ...

  8. 异形3×3魔方还原教程_【理论篇】三阶魔方4.33千亿亿种变化是怎么计算出来的?...

    本篇文章主要介绍三阶魔方总状态数是如何计算出来的,并介绍了两种算法,尽量保证语言通俗易懂,不涉及高深的理论知识(当然我也不懂:P) 一.4.33千亿亿到底有多大? 我们都知道三阶魔方的总变化状态数量为 ...

  9. 异形3×3魔方还原教程_【初级篇】(四)最简单的三阶魔方入门教程——中层还原...

    本系列教程适合刚刚接触魔方,又比较有好奇心,是为渴望学会还原魔方,又不想死记公式的人准备的.全部教程只使用三种公式,还原过程以理解为主,公式为辅. 第四部分 中层棱块还原 4.1 预览中层棱块还原后的 ...

最新文章

  1. Scrapy爬虫(8)scrapy-splash的入门
  2. WinSock I/O 模型 -- Select 模型
  3. 程序员不可能实现的6个愿望
  4. CrawlSpiders
  5. Spring异常重试框架Spring Retry
  6. oracle唯一索引能删除吗,Oracle:ora-02429:无法用于删除强制唯一/主键的索引 解决...
  7. 【java学习之路】(java SE篇)(练习)3个经典小问题
  8. qt html5播放器,Qt实现网络播放器
  9. POJ - 2718 Smallest Difference
  10. 助过网:一个月时间怎么科学有效复习公务员考试?
  11. video标签使用controls属性怎么去掉三个点
  12. cmake:指定find_package的搜索路径
  13. Cutting (暴力 + 滚动哈希判字符串匹配)
  14. spark 实现K-means算法
  15. 噪声和信噪比的转换(如何在数据集中添加噪声)
  16. 浏览器端使用less.js无法解析less文件
  17. PaddleClas-图像分类中的8种数据增广方法(cutmix, autoaugment,..)
  18. 公司财务第一周作业(代理问题、财务管理)
  19. LeetCode第334题 递增的三元子序列(c++)(建议二刷)
  20. Netty 支持哪些常用的解码器?

热门文章

  1. [读书笔记]多线程学习笔记
  2. Java线程状态及其转换
  3. 大数据学习——相关资源
  4. 用委托实现信用卡还款
  5. Java poi 在 Excel中生成统计图
  6. LruCache缓存方法
  7. F005-如是我观,知识产权 #F520
  8. pyquery 使用说明(支持python 3)
  9. linux的s权限和t权限
  10. Android GoogleMap 接入