function R = rotaEntera( I,angulo )
%ROTACION Rota una imagen angulo en grados respecto origen.
%   angulo positivo en sentido antihorario
%   R = rotaEntera( I,angulo )
%   EL TAMAÑO DE LA IMAGEN R SE AJUSTA PARA NO PERDER PARTE DE LA IMAGEN
%   Emplea transf.inversa y vecino más próximo.
%
%   Ejemplo:  
%          I = imread('caja01.bmp'); 
%          R=rotaEntera(I,15);               
%          imshow(R);                         

%_________________________________________________________________________%
% NOMBRE DEL FICHERO:   rotacion.m                                        %
% RECIBE:   Imagen de niveles de gris I                                   %
% DEVUELVE: La misma imagen rotada angulo grados, de igual tamaño que I.  %
% ALGORITMO EMPLEADO: Transformación INVERSA. Vecino más próximo          %
%              Imagen resultante del mismo tamaño. Puede perder parte img %
% VARIABLES:   I = imagen en niveles de gris a trasladar                  %
%              angulo = angulo en grados. Positivo en sentido antihorario %
%              R = imagen  resultante                                     %
% BUGS:                                                                   %
% SUPOSICIONES : 
% LIBRO  VISION ARTIFICIAL INDUSTRIAL. UNIVERSIDAD DE VALLADOLID 2012     %
% TEMA 3 MANIPULACIÓN GEOMÉTRICA DE LA IMAGEN.  pág 50                    %
% AUTORES: Eusebio de la Fuente y Félix Miguel Trespaderne                %
%_________________________________________________________________________%
%  Ejemplo de ejecucion:                                                  %
% >> I = imread('caja01.bmp');                                            %
% >> R=rotaEntera(I,15);                                                    %
% >> imshow(R);                                                           %
%_________________________________________________________________________%
% Con funciones de matlab
% >> I = imread('caja01.bmp');                                            %
% >> R = imrotate(I, 15);                                                 %
% >> imshow(R);                                                           %
%_________________________________________________________________________%

[filas,columnas]=size(I);
angRad=angulo*pi/180; %ang en grados a radianes
%matriz para guardar posicion vertices de img transf
esquinas=zeros(4,2); %4 vertices , 2 coord
%calcula a dónde irán los vértices en la imagen rotada
esquinas=calculaEsquinas(filas,columnas,angRad);
%localiza los extremos
minimos=min(esquinas);
imin=minimos(1);
jmin=minimos(2);
maximos=max(esquinas);
imax=maximos(1);
jmax=maximos(2);

filasTransf = imax - imin;
columnasTransf = jmax - jmin;
R=zeros(filasTransf,columnasTransf);  %imagen resultante del mismo tamaño. 

for i=1:filasTransf         
    for j=1:columnasTransf  
        
        %ang rotación con signo negativo pues es t.inversa
        ient= (i+imin)*cos(-angRad) - (j+jmin)*sin(-angRad);
        jent= (i+imin)*sin(-angRad) + (j+jmin)*cos(-angRad);
        
        %comprobamos que cae dentro de la imagen
        if(ient>=1 && ient<=filas && jent>=1 && jent<=columnas)
            %Vecino más próximo: redondeo al entero más cercano
            R(i,j) = I(round(ient),round(jent));
        end
    end
end
R=mat2gray(R);  
end

function esquinas=calculaEsquinas(filas,columnas,angRad)
%calcula a dónde irán los vértices en la imagen rotada

esquinas(1,:)=transfPixel(1,1,angRad);%vértice sup izdo
esquinas(2,:)=transfPixel(1,columnas,angRad);%vértice sup dcho
esquinas(3,:)=transfPixel(filas,1,angRad);%vértice inf izdo
esquinas(4,:)=transfPixel(filas,columnas,angRad);%vértice inf dcho
end

function p=transfPixel(ient,jent,angRad)

p(1)= round(ient*cos(angRad) - jent*sin(angRad));
p(2)= round(ient*sin(angRad) + jent*cos(angRad));

end
