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