function cubeoct();

r = [1,2,-3];      % osa rotace
angle = pi/60;    % uhel v radianech o kolik se krychle otoci v jednom kroku
% vrcholy krychle
vert = [-1 -1 -1; 1 -1 -1; 1 1 -1; -1 1 -1; -1 -1 1; 1 -1 1; 1 1 1; -1 1 1];

M = rotation_matrix(r,angle);   % spocti matici rotace

% nastav osy grafu
axis([-2 2 -2 2 -2 2],"square");

% nakresli krychli
draw(vert);
drawnow;

for i=1:120
   vert = (M*vert')';    % otoc vrcholy krychle pomoci matice rotace M
   clearplot;            % vymaz graf
   axis([-2 2 -2 2 -2 2],"square");
   draw(vert);           % nakresli krychli
   drawnow;
   pause(0.01);
end
return;

% Spocte matici rotace podle zadane osy rotace r o uhel a
function M=rotation_matrix(r,angle);

B = zeros(3,3);            % B je promenna pro matici prechodu
r = r/sqrt(r*r');          % udelej z r vektor velikosti 1

if (r(1)!=0 || r(2)!=0)    % pokud alespon jedna z prvnich dvou slozek vektoru r neni 0
  a = [-r(2),r(1),0];      % pak vezmi kolmy vektor a=(-r2,r1,0) na r=(r1,r2,r3)
  a = a/sqrt(a*a');        % udelej z nej vektor velikosti 1
else
  a = [1,0,0];             % jinak vezmi kolmy vektor a=(1,0,0) na r=(0,0,r3)
endif

b = cross(r,a);            % b je vektorovy soucin r,a. Nyni je (a,b,r) ortonormalni baze

B(:,1) = a';               % napln sloupce matice B bazovymi vektory a,b,r 
B(:,2) = b';               % B je matice prechodu od standardni baze k bazi (a,b,r)
B(:,3) = r';

R = [cos(angle) -sin(angle) 0;sin(angle) cos(angle) 0;0 0 1]; 

M = B*R*inv(B);            % spocti matici rotace
return;

% Vykresli krychli s vrcholy zadane argumentem v
function draw(v);

faces = [1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];

X=zeros(1,4);
Y=zeros(1,4);
Z=zeros(1,4);

hold;
for i=1:size(faces,1)
    for j=1:size(faces,2)
        X(j)=v(faces(i,j),1);
        Y(j)=v(faces(i,j),2);
        Z(j)=v(faces(i,j),3);
    endfor
    plot3(X,Y,Z);
endfor
hold;
return;

