%  DERESPOLAR - Desresolves image in polar coordinates.
%
%  Performs a deresolution operation on an image using Polar Coordinates
%
%  Usage:   deres = derespolar(im, nr, na, xc, yc)
%              where: nr = resolution in the radial direction
%                     na = resolution in the angular direction
%                     xc = column of polar origin (optional)
%                     yc = row of polar origin (optional)
%
% If xc and yc are omitted the polar origin defaults to the centre of the image

% Copyright (c) 1999 Peter Kovesi
% www.peterkovesi.com
% 
% Permission is hereby granted, free of charge, to any person obtaining a copy
% of this software and associated documentation files (the "Software"), to deal
% in the Software without restriction, subject to the following conditions:
% 
% The above copyright notice and this permission notice shall be included in 
% all copies or substantial portions of the Software.
%
% The Software is provided "as is", without warranty of any kind.

% May 1999

% This code is horribly inefficient and needs a rewrite...

function deres = derespolar(im,nr,na,xc,yc)

  [rows,cols] = size(im);
  if nargin == 3
    xc = round(cols/2);
    yc = round(rows/2);
  end
  
  if ndims(im) == 3  % Assume colour image
    deres = uint8(zeros(size(im)));
    deres(:,:,1) = iderespolar(im(:,:,1),nr,na,xc,yc);
    deres(:,:,2) = iderespolar(im(:,:,2),nr,na,xc,yc);   
    deres(:,:,3) = iderespolar(im(:,:,3),nr,na,xc,yc);       
  else
    deres = iderespolar(im,nr,na,xc,yc);
  end
  
% Internal function that does the work
  
  function deres = iderespolar(im,nr,na,xc,yc)    
    [rows,cols] = size(im);
    
    %x = ones(rows,1) * (-cols/2 : (cols/2 - 1));  
    %y = (-rows/2 : (rows/2 - 1))' * ones(1,cols);
    
    [x,y] = meshgrid(-xc:cols-xc-1, -yc:rows-yc-1);
    
    radius = sqrt(x.^2 + y.^2);       % Matrix values contain radius from centre.
    theta = atan2(y,x);               % Matrix values contain polar angle.
    
    dr = max(max(radius))/nr;
    da = max(max(theta+pi))/na;
    
    rp = round(radius/dr)*dr;
    ra = round(theta/da)*da;
    
    rowp = yc + rp.*sin(ra);
    colp = xc + rp.*cos(ra);
    
    rowp = round(rowp);
    colp = round(colp);
    rowp = max(rowp,1); rowp = min(rowp,rows);
    colp = max(colp,1); colp = min(colp,cols);
    
    for row = 1:rows
      for col = 1:cols
	deres(row,col) = im(rowp(row,col), colp(row,col));
      end
    end
