对于魔方的表示:
先看一串天书般的字母: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];