atan2dx.m 970 Bytes
Newer Older
Valentin Platzgummer's avatar
Valentin Platzgummer committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
function z = atan2dx(y, x)
%ATAN2DX  Compute 2 argument arctangent with result in degrees
%
%   z = ATAN2DX(y, x) compute atan2(y, x) with result in degrees in
%   (-180,180] and quadrant symmetries enforced.  x and y must have
%   compatible shapes.

  persistent octavep
  if isempty(octavep)
    octavep = exist('OCTAVE_VERSION', 'builtin') ~= 0;
  end
  if ~octavep
    % MATLAB implements symmetries already
    z = atan2d(y, x);
  else
    q1 = abs(y) > abs(x); q2 = ones(size(q1));
    x = q2 .* x; y = q2 .* y;           % expand x, y if necessary
    t = y(q1); y(q1) = x(q1); x(q1) = t;
    q2 = x < 0; x(q2) = -x(q2);
    q = 2 * q1 + q2;
    z = atan2(y, x) * (180 / pi);       % z in [-45, 45]
    % t = q == 0;        z(t) =    0 + z(t);
    t = q == 1 & y >= 0; z(t) =  180 - z(t);
    t = q == 1 & y <  0; z(t) = -180 - z(t);
    t = q == 2;          z(t) =   90 - z(t);
    t = q == 3;          z(t) =  -90 + z(t);
  end
end