MATLAB对三阶魔方建模并进行旋转操作

对于魔方的表示:

 

先看一串天书般的字母: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];

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葬骸缤纷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值