function R = rotacionIntBilineal( I,angulo )
%ROTACIONINTBILINEAL Rota una imagen un angulo (en grados) respecto origen.
%   angulo positivo en sentido antihorario
%   R = rotacionIntBilineal( I,angulo )
%   Imagen R del mismo tamaño que I
%   Emplea transf.inversa e INTERPOLACION BILINEAL.
%
%   Ejemplo:  
%          I = imread('caja01.bmp'); 
%          R=rotacionIntBilineal(I,15);               
%          imshow(R);                         

%_________________________________________________________________________%
% NOMBRE DEL FICHERO:   rotacionIntBilineal.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. Interp.BILINEAL             %                      
% 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=rotacionIntBilineal(I,15);                                         %
% >> imshow(R);                                                           %
%_________________________________________________________________________%
% Con funciones de matlab
% >> I = imread('caja01.bmp');                                            %
% >> R = imrotate(I, 15, 'bilinear');                                     %
% >> imshow(R);                                                           %
%_________________________________________________________________________%

[filas,columnas]=size(I);
R=zeros(filas,columnas);
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);
              
        %Si cae dentro de la imagen calcula interpolación
        if(ient>=1 && ient<filas && jent>=1 && jent<columnas)
            R(i,j)=interpolaBilineal(ient,jent,I);
        end
    end
end
R=mat2gray(R);  
end

