www.pudn.com > calibr8.zip > dir2rot.m


function [out1, out2] = dir2rot(in1, in2)
%[out1, out2] = DIR2ROT(in1, in2)
%
%Convert between direction and rotation matrix. Variants:
%  [rotangle, rotaxis] = DIR2ROT(origdir, finaldir)
%  rotmatrix = DIR2ROT(origdir, finaldir)
%  rotmatrix = DIR2ROT(rotangle, rotaxis)
%  rotmatrix = DIR2ROT(rotangle, rotaz)
%
%Variables:
%  ORIGDIR   - original direction
%  FINALDIR  - final direction (default [0, 0, 1])
%  ROTANGLE  - angle of rotation (in degrees)
%  ROTAXIS   - axis of rotation (default [0, 0, 1])
%  ROTAZ     - azimuth of rotation (in degrees)
%  ROTMATRIX - 3x3 rotation matrix 
%
%See also:
%  ROTMATRIX, TRANSFORM
%
%Radim Halir, Charles University Prague, halir@ms.mff.cuni.cz
%Created: 17.11.1996
%Last modified 14.1.1998

% default parameters
if (nargin == 1)
  in2 = [0, 0, 1];
end

if (length(in1) == 1)
% input: angle rotaxis/azimuth
  rotangle = in1;
  if (length(in2) == 1)
    % azimuth
    in2 = in2 / 180 * pi;
    rotaxis = [- sin(in2), cos(in2), 0];
  else
    % rotation axis
    rotaxis = in2;
  end
else
% input: original_direction final_direction
  in1 = vnorm(in1(:)');
  in2 = vnorm(in2(:)');
  
  if( cross(in1, in2) == [0,0,0] )
  %oba kolme
    if(nargout > 1)
      out1 = 0;
      out2 = in2;
      return;
    else
      out1 = eye(3);
      return;
    end
  end
  
  rotangle = acos(dot(in1, in2)) / pi * 180;
  rotaxis = vnorm(cross(in1, in2));
  if (nargout > 1)
    out1 = rotangle;
    out2 = rotaxis;
    return
  end
end

% check the angle
if (rem(rotangle, 360) == 0)
  out1 = eye(3);
  return
end
  
% create quaternion
rotangle = (rotangle / 180 * pi) / 2;
m = [cos(rotangle) sin(rotangle) * vnorm(rotaxis(:)')];

% quaternion -> rotation matrix
m = m' * m;
m01 = m(1, 2);
m02 = m(1, 3);
m03 = m(1, 4);
m11 = m(2, 2);
m12 = m(2, 3);
m13 = m(2, 4);
m22 = m(3, 3);
m23 = m(3, 4);
m33 = m(4, 4);
rot = 2 * [0.5 - (m22 + m33), m12 - m03, m13 + m02; ...
           m12 + m03, 0.5 - (m11 + m33), m23 - m01; ...
           m13 - m02, m23 + m01, 0.5 - (m11 + m22)];
out1 = rot;