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

    function RotateWithMouse(bOnlyRotCube)
% to rotate cube or layer with mouse
%    RotateWithMouse[(bOnlyRotCube)]

if nargin==0
	bOnlyRotCube=false;
end
hAxes=gca;
Cube=get(hAxes,'UserData');
hFig = get(hAxes,'Parent');
p = get(hFig,'CurrentPoint'); % pointer coordinates
pinpol = 0; % <>0, if Pointer is in any polygon
iCube=get(gco,'UserData');iCube=iCube(end);
if any(iCube==[23 15 17])
	% mid cube
else
	for k=1:size(Cube.PgRotCubeX,2), % for cube rotation
		if inpolygon(p(1),p(2),Cube.PgRotCubeX(:,k),Cube.PgRotCubeY(:,k))==1,
			pinpol = -k;
			break;
		end
	end
	if pinpol==0&~bOnlyRotCube, % for layer rotation
		for k=1:size(Cube.PgRotLayX,2),
			if inpolygon(p(1),p(2),Cube.PgRotLayX(:,k),Cube.PgRotLayY(:,k))==1,
				pinpol = k;
				break;
			end
		end
	end
end
if pinpol<0, % to rotate cube
	Axe = fix((-pinpol-1)/4)+1;
	Direction = 1-mod(fix((-pinpol-1)/2),2)*2;
	Cube = RotateCube(hAxes,Cube,Axe,Direction);
elseif pinpol>0, % to rotate layer
	Axe = fix((pinpol-1)/8)+1;
	Side = 1-mod(fix((pinpol-1)/4),2)*2;
	Direction = 1-mod(fix((pinpol-1)/2),2)*2;
	if ~isempty(Cube.sol)
		Cube.sol=[];
		showsol stop
	end
	Cube = RotateLayer(hAxes,Cube,Axe,Side,Direction,1);
	Congr(hAxes,Cube); % Congratulation
end
set(hAxes,'UserData',Cube);
if strcmp(get(gcf,'Tag'),'RubikSettingUp')
	SetColors('rotated')
end