gusucode.com > 三维模仿源码程序 > 三维模仿源码程序/MathRubik2/showsol.m

    function showsol(Cube,varargin)
%showsol  - Shows the solution
hAxes=FindRubikAxes;
if nargin<1|isempty(Cube)
	Cube=FindRubikCube;
elseif ischar(Cube)
	switch Cube
	case 'key'
		switch get(gcf,'CurrentCharacter')
		case {'n',' '}
			ShowTurn(hAxes,1)
		case 'N'
			ShowTurn(hAxes,1,-1)
		case 'p'
			ShowTurn(hAxes,-1)
		case 'P'
			ShowTurn(hAxes,-1,-1)
		case 's'
			ShowTurn(hAxes,-Inf)
		case 'S'
			ShowTurn(hAxes,-Inf,-1)
		case 'T'
			ShowTurn(hAxes,-Inf,0)
		case 'e'
			ShowTurn(hAxes,Inf)
		case 'E'
			ShowTurn(hAxes,Inf,-1)
		case 'F'
			ShowTurn(hAxes,Inf,0)
		case 'X'
			StopShow(hAxes,Cube)
	end
	case 'next'
		ShowTurn(hAxes,1)
	case 'back'
		ShowTurn(hAxes,-1)
	case 'backall'
		ShowTurn(hAxes,-Inf)
	case 'stop'
		StopShow(hAxes,Cube)
	end
	return
end
% Startup settings
Cube.iSol=0;
ShowTitle(hAxes,Cube)
set(hAxes,'UserData',Cube)
set(gcf,'KeyPressFcn','showsol key')

function  StopShow(hAxes,Cube)
Cube.sol=[];
set(hAxes,'UserData',Cube)
set(get(hAxes,'Parent'),'KeyPressFcn','')
ShowTitle(hAxes,Cube);

function ShowTurn(hAxes,dx,Anim)
if nargin<3
	Anim=1;
end
Cube=get(hAxes,'UserData');
i=Cube.iSol;
n=size(Cube.sol,1);
while dx&i<=n
	if dx>0
		i=i+1;
		if i>n
			i=n;
			break;
		end
		sol=Cube.sol(i,:);
		dx=dx-1;
	else	% dx<0
		if i<1
			break;
		end
		sol=Cube.sol(i,:);
		if sol(2)<2
			sol(2)=-sol(2);
		end
		i=i-1;
		dx=dx+1;
	end
	Cube=RotateLayer(sol,Anim,hAxes,Cube);
	if Anim
		axes(hAxes)
		ShowTitle(hAxes,Cube,i)
		drawnow
	end
end
Cube.iSol=i;
set(hAxes,'UserData',Cube)
if Anim==0
	PlotCube(hAxes,Cube);
end
ShowTitle(hAxes,Cube)