function IR=ruota_im(I, a, s)
% IR=ruota_im(I, a, s)
% I: immagine
% a: angolo in radianti
% s: fattore di scala
% IR: immagine ruotata
% Data un immagine I, un angolo ed un fattore di scala s
% restituisce un'immagine IR ruotata di un angolo a e scalata di s
% L'immagine IR non ha dimensione dell'immagine iniziale, ma risulta
% ingrandita quando s>1


[altezza,larghezza]=size(I);
if ~isa(I, 'double')
    I=double(I);
end

% centro di rotazione
cx=floor(larghezza/2);
cy=floor(altezza/2);

% rotazione di a radianti in senso orario 
% (la rotazione sara' antioraria a causa del ribaltamento)
T=[s*cos(a) s*sin(a); -s*sin(a), s*cos(a)];


% la traformazione che si effettua sulla figura e' una rotazione 
% di a radiati intorno attorno al punto centrale [cx;cy] 
%   [x;y] -> T[x-cx;y-cy] 

% calcolo delle coordinate delle trasformate degli estremi della figura
es1=T*[1-cx;1-cy];
es2=T*[1-cx;altezza-cy];
es3=T*[larghezza-cx;altezza-cy];
es4=T*[larghezza-cx;1-cy];

esx=[es1(1), es2(1), es3(1), es4(1)]';
esy=[es1(2), es2(2), es3(2), es4(2)]';

% queste sono gli estremi della figura trsformata
xmax=max(esx);  ymax=max(esy);
xmin=min(esx);  ymin=min(esy);


% matrici degli indici di riga e colonna 
[xw, yw]=meshgrid(round(xmin):round(xmax), round(ymin):round(ymax));

% dimensioni dell'imagine trasformata
[nr, nc]=size(xw);

% il pixel (i,j) dell'immagine rappresenta il punto del piano di coordinate xw(i,j) yx(i,j)


%calcolo coordinate della controiimagine di ogni pixel
% la controiimagine del punto di coordinate x,y e'
%  = T^(-1) [x;y] + [cx;cy]
X=T\[xw(:) yw(:)]';                              % applico T^(-1) su tutti i punti
xwt = reshape(X(1,:), nr,nc)+ cx*ones(nr,nc);    % aggiungo cx alle ascisse
ywt = reshape(X(2,:), nr,nc) + cy*ones(nr,nc);   % aggiungo cy alle ordinate


% il pixel (i,j) della nuova immagine deve avere il colore del punto 
% xwt(i,j),ywt(i,j) della vecchia immagine. 
% xwt(i,j),ywt(i,j) non son interi quindi uso l'interpolazione
IR=interp2(I, xwt,ywt);
