image thumbnail

Mathworks Rubik version 2

by

 

04 Apr 2013 (Updated )

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

SmCube(:,3)*2+2*k-5+(k-2)*dOffset; end end end
function [Cube,varargout] = InitCube(Cube,varargin)
%InitCube - initialize the cube
%    Cube = InitCube[(Cube)]

if nargin==0
	Cube=[];
end
if isempty(Cube)
	dOffset=[];
	bFullCube=false;
% 	if ~isempty(varargin)
% 		setoptions({'dOffset','bFullCube'},varargin{:})
% 	end
	if isempty(dOffset)
		if bFullCube
			dOffset=0.3;
		else
			dOffset=0;
		end
	end
	Order=[1 5 7 3;2 4 8 6;1 2 6 5;...
		3 7 8 4;1 3 4 2;5 6 8 7];
	ValColor=[0 0 0;1 0 0;1 0 1;0 0 1;0 1 0;1 1 0;1 1 1];
	Color=zeros(6,27);
	RotCubeCube=	... % for rotate cube
		[ 7  8  9 16 17 18 25 26 27  4  5  6 13 14 15 22 23 24  1  2  3 10 11 12 19 20 21;...
		 19 20 21 10 11 12  1  2  3 22 23 24 13 14 15  4  5  6 25 26 27 16 17 18  7  8  9;...
		 19 10  1 22 13  4 25 16  7 20 11  2 23 14  5 26 17  8 21 12  3 24 15  6 27 18  9;...
		  3 12 21  6 15 24  9 18 27  2 11 20  5 14 23  8 17 26  1 10 19  4 13 22  7 16 25;...
		  3  6  9  2  5  8  1  4  7 12 15 18 11 14 17 10 13 16 21 24 27 20 23 26 19 22 25;...
		  7  4  1  8  5  2  9  6  3 16 13 10 17 14 11 18 15 12 25 22 19 26 23 20 27 24 21];
	RotCubeFlat=	... % for rotate cube
		[1 2 5 6 4 3;...
		1 2 6 5 3 4;...
		6 5 3 4 1 2;...
		5 6 3 4 2 1;...
		3 4 2 1 5 6;...
		4 3 1 2 5 6];
	RotLayerCube= ... % for rotate layer
		[7 4 1 16 13 10 25 22 19;	...
		 3:3:27;	...
		 1 2 3 10 11 12 19 20 21;	...	smCubeSurfaces in Cube
		 9 8 7 18 17 16 27 26 25;	...
		 1 4 7 2 5 8 3 6 9;	...
		 21 24 27 20 23 26 19 22 25];
	Nodes=GetNodes(dOffset);
	iMid=RotLayerCube(:,5)';
	iMidInd=(iMid-1)*6+(1:6);
	iCorner=[1 3 7 9];
	iCorner=[iCorner iCorner+18];
	iEdge=2:2:8;
	iEdge=[iEdge 10 12 16 18 iEdge+18];
	cubeType=zeros(1,27);
	cubeType(iMid)=1;
	cubeType(iEdge)=2;
	cubeType(iCorner)=3;
	iLayerFaceInd=repmat((1:6)',1,9)+(RotLayerCube-1)*6;
	iExtraFaces=[3 4 5 6;1 2 5 6;1 2 3 4];
	iExtraFaces=iExtraFaces([1 1 2 2 3 3],:);

	% Mouse polygons for any rotations
	PgRotCubeX = ... % for rotate the cube around OX, OY, OZ
		[[168;114;171;225;168],[292;292;346;346;292],...
		[232;292;346;287;232],[292;347;347;292;292],...
		[232;171;119;180;232],[119;180;180;119;119],...
		[340;278;225;287;340],[119;180;180;119;119],...
		[240;240;180;180;240],[400;400;346;346;400],...
		[60;60;119;119;60],[292;292;240;240;292]];
	PgRotCubeY = ... 
		[[373;345;323;350;373],[273;214;239;299;273],...
		[296;273;299;324;296],[89;117;176;148;89],...
		[296;323;294;272;296],[107;85;146;170;107],...
		[352;375;350;324;352],[234;209;272;294;234],...
		[123;187;209;146;123],[203;265;239;176;203],...
		[256;191;170;234;256],[148;214;187;123;148]];
	PgRotLayX = ... % for rotate the layer
		[[240;292;232;240],[240;292;292;240],...
		[60;171;114;60],[240;292;292;240],...
		[220;168;225;220],[400;346;346;400],...
		[400;287;346;400],[400;347;347;400],...
		[400;340;287;400],[240;180;180;240],...
		[240;232;180;240],[240;180;180;240],...
		[60;119;171;60],[60;119;119;60],...
		[220;225;278;220],[60;119;119;60],...
		[60;60;119;60],[240;240;292;240],...
		[240;180;240;240],[400;346;400;400],...
		[240;240;180;240],[400;400;347;400],...
		[60;119;60;60],[240;292;240;240]];
	PgRotLayY = ... 
		[[246;273;296;246],[60;89;148;60],...
		[319;323;345;319],[246;214;273;246],...
		[398;373;350;398],[329;299;239;329],...
		[329;324;299;329],[142;176;117;142],...
		[329;352;324;329],[246;272;209;246],...
		[246;296;272;246],[60;146;85;60],...
		[319;294;323;319],[133;107;170;133],...
		[398;350;375;398],[319;234;294;319],...
		[319;256;234;319],[246;187;214;246],...
		[246;209;187;246],[329;239;265;329],...
		[60;123;146;60],[142;203;176;142],...
		[133;170;191;133],[60;148;123;60]];
	hand = ...
		[NaN,NaN,NaN,NaN,NaN,NaN,NaN,  1,  1,NaN,NaN,NaN,NaN,NaN,NaN,NaN;...
		NaN,NaN,NaN,NaN,  1,  1,  1,  2,  2,  1,  1,  1,NaN,NaN,NaN,NaN;...
		NaN,NaN,NaN,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1,NaN,NaN,NaN;...
		NaN,NaN,NaN,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1,NaN,NaN,NaN;...
		NaN,NaN,NaN,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  1,  1,NaN;...
		NaN,  1,  1,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1;...
		1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1;...
		1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1;...
		1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1;...
		1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1,  2,  2,  1;...
		1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  1,  2,  2,  1;...
		1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  1;...
		NaN,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  1;...
		NaN,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  1,NaN;...
		NaN,NaN,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  1,NaN;...
		NaN,NaN,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  1,NaN];
	rotUp = [...	%!!!!niet gebruikt!!!!
		NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN NaN   2   2   2 NaN NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN   2   2   1   2   2 NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN   2   2   1   1   1   2   2 NaN NaN NaN NaN NaN
		NaN NaN NaN   2   2   1   2   1   2   1   2   2 NaN NaN NaN NaN
		NaN NaN   2   2   1   2   2   1   2   2   1   2   2 NaN NaN NaN
		NaN   2   2   1   2   2   2   1   2   2   2   1   2   2 NaN NaN
		2   2   1   2   2 NaN   2   1   2 NaN   2   2   1   2   2 NaN
		2   1   2   2 NaN NaN   2   1   2 NaN NaN   2   2   1   2 NaN
		2   2   2 NaN NaN NaN   2   1   2 NaN NaN NaN   2   2   2 NaN
		NaN NaN NaN NaN NaN NaN   2   1   2 NaN NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN NaN   2   1   2 NaN NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN NaN   2   1   2 NaN NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN NaN   2   1   2 NaN NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN NaN   2   1   2 NaN NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN NaN   2   2   2 NaN NaN NaN NaN NaN NaN NaN];
	rotLeftUp = [...	%!!!!niet gebruikt!!!!
		2   2   2   2   2   2   2   2   2   2 NaN NaN NaN NaN NaN NaN
		2   1   1   1   1   1   1   1   1   2 NaN NaN NaN NaN NaN NaN
		2   1   1   2   2   2   2   2   2   2 NaN NaN NaN NaN NaN NaN
		2   1   2   1   2   2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
		2   1   2   2   1   2   2 NaN NaN NaN NaN NaN NaN NaN NaN NaN
		2   1   2   2   2   1   2   2 NaN NaN NaN NaN NaN NaN NaN NaN
		2   1   2 NaN   2   2   1   2   2 NaN NaN NaN NaN NaN NaN NaN
		2   1   2 NaN NaN   2   2   1   2   2 NaN NaN NaN NaN NaN NaN
		2   1   2 NaN NaN NaN   2   2   1   2   2 NaN NaN NaN NaN NaN
		2   2   2 NaN NaN NaN NaN   2   2   1   2   2 NaN NaN NaN NaN
		NaN NaN NaN NaN NaN NaN NaN NaN   2   2   1   2   2 NaN NaN NaN
		NaN NaN NaN NaN NaN NaN NaN NaN NaN   2   2   1   2   2 NaN NaN
		NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN   2   2   1   2 NaN NaN
		NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN   2   2   2 NaN NaN
		NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN];
	arrows = [...
		NaN NaN NaN NaN NaN   2   2   1   2   2 NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN   2   2   1   1   1   2   2 NaN NaN NaN NaN NaN
		NaN NaN NaN NaN   2   1   2   1   2   1   2 NaN NaN NaN NaN NaN
		NaN NaN NaN NaN   2   1   2   1   2   1   2 NaN NaN NaN NaN NaN
		NaN   2   2   2   2   2   2   1   2   2   2   2   2   2 NaN NaN
		2   2   1   1   2 NaN NaN   1 NaN NaN   2   1   1   2   2 NaN
		2   1   2   2   2 NaN NaN   1 NaN NaN   2   2   2   1   2 NaN
		1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 NaN
		2   1   2   2   2 NaN NaN   1 NaN NaN   2   2   2   1   2 NaN
		2   2   1   1   2 NaN NaN   1 NaN NaN   2   1   1   2   2 NaN
		NaN   2   2   2   2   2   2   1   2   2   2   2   2   2 NaN NaN
		NaN NaN NaN NaN   2   1   2   1   2   1   2 NaN NaN NaN NaN NaN
		NaN NaN NaN NaN   2   1   2   1   2   1   2 NaN NaN NaN NaN NaN
		NaN NaN NaN NaN   2   2   1   1   1   2   2 NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN   2   2   1   2   2 NaN NaN NaN NaN NaN NaN
		NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN];
	Cube = struct('Nodes',Nodes	...
		,'Order',Order	...
		,'ValColor',ValColor	...
		,'Color',Color	...
		,'iMid',iMid,'iMidInd',iMidInd,'iCorner',iCorner	...
		,'iEdge',iEdge,'cubeType',cubeType	...
		,'bFullCube',bFullCube	...
		,'RotCubeCube',RotCubeCube	...
		,'RotCubeFlat',RotCubeFlat	...
		,'RotLayerCube',RotLayerCube ...
		,'iLayerFaceInd',iLayerFaceInd	...
		,'iExtraFaces',iExtraFaces	...
		,'texture',[]	...
		,'PgRotCubeX',PgRotCubeX,'PgRotCubeY',PgRotCubeY	... 
		,'PgRotLayX',PgRotLayX,'PgRotLayY',PgRotLayY	... 
		,'hand',hand	...
		,'arrows',arrows	...
		,'sol',[],'iSol',0	...
		);
elseif ischar(Cube)
	i=strmatch(lower(Cube),{'doffset','toggleoffset','defaultoffset'});
	switch i
	case 1	% doffset
		Cube=GetNodes(varargin{1});
	case {2,3}	% toggleoffset, defaultoffset
		C=varargin{1};
		if i==2
			b=C.Nodes(1,1,2)<=C.Nodes(2,1,1);
		else
			b=C.bFullCube;
		end
		if b
			dOffset=0.3;
		else
			dOffset=0;
		end
		Cube=GetNodes(dOffset);
		if nargout>1
			varargout={dOffset};
		end
	end
	return
end
Cube.Color(:)=0;
for i=1:6,
	Cube.Color(Cube.iLayerFaceInd(i,:)) = i;
end
if Cube.bFullCube
	Cube=MakeFullCube(Cube);
end
Cube.history=[];

function Nodes=GetNodes(dOffset)
SmCube = ...
	[[0 0 0]; [1 0 0]; [0 1 0]; [1 1 0]; ...
	[0 0 1]; [1 0 1]; [0 1 1]; [1 1 1]];
Nodes=zeros(8,3,27);
for i=1:3,
	for j=1:3,
		for k=1:3,
			Nodes(:,1,(k-1)*9+(j-1)*3+i) = SmCube(:,1)*2+2*i-5+(i-2)*dOffset;
			Nodes(:,2,(k-1)*9+(j-1)*3+i) = SmCube(:,2)*2+2*j-5+(j-2)*dOffset;
			Nodes(:,3,(k-1)*9+(j-1)*3+i) = SmCube(:,3)*2+2*k-5+(k-2)*dOffset;
		end
	end
end

Contact us