function R = rotacion( I,angulo )
%ROTACION Rota una imagen angulo en grados respecto origen.
%   angulo positivo en sentido antihorario
%   R = rotacion( I,angulo )
%   Imagen R del mismo tamaño que I. Puede perderse parte de la imagen
%   Emplea transf.inversa y vecino más próximo.
%
%   Ejemplo:  
%          I = imread('caja01.bmp'); 
%          R=rotacion(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                                     %
%              filas = numero de filas de I                               %
%              columnas = numero de columnas de I                         %
%              ient = fila en la imag.de entrada correspond.a pixel R(i,j)% 
%              jent = colum en  imag. de entrada correspond.a pixel R(i,j)%
% BUGS:                                                                   %
% SUPOSICIONES : La imagen de salida es del mismo tamaño.                 %                   
%                Puede perderse una parte significativa de la imagen      %
% 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=rotacion(I,15);                                                    %
% >> imshow(R);                                                           %
%_________________________________________________________________________%
% Con funciones de matlab
% >> I = imread('caja01.bmp');                                            %
% >> R = imrotate(I, 15);                                                 %
% >> imshow(R);                                                           %
%_________________________________________________________________________%

[filas,columnas]=size(I);
R=zeros(filas,columnas);  %imagen resultante del mismo tamaño. 
angRad=angulo*pi/180;
for i=1:filas         
    for j=1:columnas  
        
        %ang rotación con signo negativo pues es t.inversa
        ient= i*cos(-angRad) - j*sin(-angRad);
        jent= i*sin(-angRad) + j*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

