## Copyright (C) 2017 Nicholas R. Jankowski
## 
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3 of the License, or
## (at your option) any later version.
## 
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
## 
## You should have received a copy of the GNU General Public License
## along with this program.  If not, see <http://www.gnu.org/licenses/>.

## -*- texinfo -*- 
## @deftypefn {} @var{T} = roty (@var{angle})
##
## @code{roty} returns the 3x3 transformation matrix corresponding to a rotation
## about the y axis by the specified @var{angle}, given in degrees, where a
## positive angle corresponds to a counter-clockwise rotation when viewing the
## z-x plane from the positive y side.
##
## The form of the transformation matrix is:
## 
## @tex
## $$
## \left[\matrix{cos(angle) & 0 & sin(angle) \cr
##               0 & 1 & 0 \cr
##               -sin(angle) & 0 & cos(angle)}\right].
## $$
## @end tex
## @ifnottex
##
## @example
## @group
##      |  cos(@var{angle})  0  sin(@var{angle}) |
##  T = |      0       1      0      |
##      | -sin(@var{angle})  0  cos(@var{angle}) |
## @end group
## @end example
## @end ifnottex
##  
## @seealso{rotx, rotz, createRotation, createRotationOx, createRotationOy, 
##   createRotationOz}
## @end deftypefn

## Author: Nicholas Jankowski <jankowskin@asme.org>
## Created: 2017-04-09

function retmat = roty (angle_in_deg)

  if ((nargin ~= 1) || (~isscalar (angle_in_deg)))
    print_usage;
  endif
  
  angle_in_rad = angle_in_deg * pi / 180;  
  
  s = sin (angle_in_rad);
  c = cos (angle_in_rad);
  
  retmat = [c 0 s; 0 1 0; -s 0 c];

endfunction

%!test
%! assert (roty (0), [1 0 0; 0 1 0; 0 0 1])
%! assert (roty (45), [sqrt(2) 0 sqrt(2); 0 2 0; sqrt(2) 0 sqrt(2)]./2, 1e-12)
%! assert (roty (90), [0 0 1; 0 1 0; -1 0 0], 1e-12)
%! assert (roty (180), [-1 0 0; 0 1 0; 0 0 -1], 1e-12)

## Test input validation
%!error roty ()
%!error roty (1, 2)
%!error roty ([1 2 3])
