function picRotate = matRotate(pic,theta)
% 0 <= theta < 180
% Unlike imrotate.m, matRotate generates images with equal sizes
% (both sides have the length of the diagonal of the original image)
% pic is the input image matrix and theta is in degrees rather than radians
% 4-means interpolation is used
theta = theta*pi/180;
picRotate = zeros(ceil(sqrt((size(pic,1))^2+(size(pic,2))^2)),ceil(sqrt((size(pic,1))^2+(size(pic,2))^2)));
for x = 1:size(pic,2)
for y = 1:size(pic,1)
ind=[cos(theta) -sin(theta);sin(theta) cos(theta)]*[(x-0.5*size(pic,2));(y-0.5*size(pic,1))]; % Multiply with the rotation matrix
ind(1) = ceil(ind(1) + 0.5*ceil(sqrt((size(pic,1))^2+(size(pic,2))^2)));
ind(2) = ceil(ind(2) + 0.5*ceil(sqrt((size(pic,1))^2+(size(pic,2))^2))); % Allocate indices
picRotate(ind(2),ind(1)) = pic(y,x);
end
end
% Interpolation using bilinear/4-means method
for row = 2:(size(picRotate,1)-1)
for column = 2:(size(picRotate,2)-1)
if (picRotate(row,column) == 0) && (picRotate(row,column-1) ~= 0) && (picRotate(row,column+1) ~= 0)
picRotate(row,column) = mean([picRotate(row,column-1),picRotate(row,column+1),picRotate(row-1,column),picRotate(row,column+1)]);
end
end
end