Code covered by the BSD License

# Mathworks Rubik version 2

### Thomas Beneder (view profile)

04 Apr 2013 (Updated )

Display, tester and solver of the Rubik's game, including "full cubes".

MyColor;
function CubeOut = RotateCube(hAxes,Cube,Axe,Direction,Anime)
%RotateCube - to rotate all cube
%    Cube = RotateCube(hAxes,Cube,Axe,Direction)
%       If output argument is not given, the result is put in hAxes's
%       UserData.
%    Axe : 1 = F, 2 = R, 3 = U
%    Direction : 1 = clockwise, -1 = counter clockwise.

if Direction
if ~exist('Anime','var')|isempty(Anime)
Anime=1;
end

%!!!!!!!
if ~isempty(Cube.texture)&Anime==1
Anime=-1;
end
%!!!!!!!

if Anime>0
MyCube = Cube; % copy object
a1 = Axe; % 1st axe
a2 = Axe+1;
if a2>3,
a2 = 1;
end % 2nd axe
a3 = 6-a1-a2; % 3rd axe
cosa = cos(Direction*pi/36); % cos(+-1 degree)
sina = sin(Direction*pi/36); % sin(+-1 degree)
T = zeros(3);
T(a1,a1) = 1;
T(a2,a2) = cosa;
T(a2,a3) = -sina;
T(a3,a2) = sina;
T(a3,a3) = cosa;
for k1=1:18, % angle loop
for k2=1:27, % small cube loop
MyCube.Nodes(:,:,k2) = MyCube.Nodes(:,:,k2)*T';
end
PlotCube(hAxes,MyCube,1,0);
drawnow;
end
end
ind = 2*Axe-1+(1-sign(Direction))/2; % index number
MyColor = zeros(size(Cube.Color));
for iDir=1:abs(Direction)	% Direction == 2 is allowed (!)
for k1=1:27, % small cube loop
for k2=1:6, % flat loop
MyColor(Cube.RotCubeFlat(ind,k2),Cube.RotCubeCube(ind,k1)) = ...
Cube.Color(k2,k1);
end
end
Cube.Color = MyColor; % change colors
end
if Anime
PlotCube(hAxes,Cube,Anime>0,1);
ShowTitle(hAxes,Cube)
end
H=Cube.history;
Aconv=[1 -3 2;3 2 -1;-2 1 3];
for i=1:size(H,1)
if Axe~=H(i)
a=Aconv(H(i),Axe);
H(i)=abs(a);
H(i,2)=H(i,2)*sign(a)*Direction;
end
end
Cube.history=H;
end
if nargout
CubeOut=Cube;
else
set(hAxes,'UserData',Cube)
end