# HG changeset patch
# User Nicholas R. Jankowski <jankowskin@asme.org>
# Date 1491793637 14400
#      Sun Apr 09 23:07:17 2017 -0400
# Node ID 073a85a0b42179e746263492a4fdc94349a83c45
# Parent  17e8ecfe03540d9e4d6a5231c9a750fb7a076844
Added missing functions rotx, roty, and rotz (bug #50772)

* /inst/geom3d/rotx.m roty.m and rotz.m: new function m-files, simple function to make rotation matrix about x, y, or z

diff -r 17e8ecfe0354 -r 073a85a0b421 inst/geom3d/rotx.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inst/geom3d/rotx.m	Sun Apr 09 23:07:17 2017 -0400
@@ -0,0 +1,76 @@
+## 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} = rotx (@var{angle})
+##
+## @code{rotx} returns the 3x3 transformation matrix corresponding to a rotation
+## about the x axis by the specified @var{angle}, given in degrees, where a
+## positive angle corresponds to a counter-clockwise rotation when viewing the
+## y-z plane from the positive x side.
+##
+## The form of the transformation matrix is:
+## 
+## @tex
+## $$
+## \left[\matrix{ 1 & 0 & 0 \cr
+##               0 & cos(angle) & -sin(angle)\cr
+##               0 & sin(angle) & cos(angle)}\right].
+## $$
+## @end tex
+## @ifnottex
+##
+## @example
+## @group
+##      | 1      0           0      |
+##  T = | 0  cos(@var{angle}) -sin(@var{angle}) |
+##      | 0  sin(@var{angle})  cos(@var{angle}) |
+
+## @end group
+## @end example
+## @end ifnottex
+##  
+## @seealso{roty, rotz, createRotation, createRotationOx, createRotationOy, 
+##   createRotationOz}
+## @end deftypefn
+
+## Author: Nicholas Jankowski <jankowskin@asme.org>
+## Created: 2017-04-09
+
+function retmat = rotx (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 = [1 0 0; 0 c -s; 0 s c];
+
+endfunction
+
+%!test
+%! assert (rotx (0), [1 0 0; 0 1 0; 0 0 1])
+%! assert (rotx (45), [1, 0, 0; [0; 0],[(sqrt(2)/2).*[1 -1; 1 1]]], 1e-12)
+%! assert (rotx (90), [1 0 0; 0 0 -1; 0 1 0], 1e-12)
+%! assert (rotx (180), [1 0 0; 0 -1 0; 0 0 -1], 1e-12)
+
+## Test input validation
+%!error rotx ()
+%!error rotx (1, 2)
+%!error rotx ([1 2 3])
diff -r 17e8ecfe0354 -r 073a85a0b421 inst/geom3d/roty.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inst/geom3d/roty.m	Sun Apr 09 23:07:17 2017 -0400
@@ -0,0 +1,75 @@
+## 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])
diff -r 17e8ecfe0354 -r 073a85a0b421 inst/geom3d/rotz.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inst/geom3d/rotz.m	Sun Apr 09 23:07:17 2017 -0400
@@ -0,0 +1,75 @@
+## 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} = rotz (@var{angle})
+##
+## @code{rotz} returns the 3x3 transformation matrix corresponding to a rotation
+## about the z axis by the specified @var{angle}, given in degrees, where a
+## positive angle corresponds to a counter-clockwise rotation when viewing the
+## x-y plane from the positive z side.
+##
+## The form of the transformation matrix is:
+## 
+## @tex
+## $$
+## \left[\matrix{cos(angle) & -sin(angle) & 0 \cr
+##               sin(angle) & cos(angle) & 0 \cr
+##               0 & 0 & 1}\right].
+## $$
+## @end tex
+## @ifnottex
+##
+## @example
+## @group
+##      | cos(@var{angle}) -sin(@var{angle}) 0 |
+##  T = | sin(@var{angle})  cos(@var{angle}) 0 |
+##      |     0           0      1 |
+## @end group
+## @end example
+## @end ifnottex
+##  
+## @seealso{rotx, roty, createRotation, createRotationOx, createRotationOy, 
+##   createRotationOz}
+## @end deftypefn
+
+## Author: Nicholas Jankowski <jankowskin@asme.org>
+## Created: 2017-04-09
+
+function retmat = rotz (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 -s 0; s c 0; 0 0 1];
+
+endfunction
+
+%!test
+%! assert (rotz (0), [1 0 0; 0 1 0; 0 0 1])
+%! assert (rotz (45), [(sqrt(2)/2).*[1 -1; 1 1] ,[0; 0]; 0, 0, 1], 1e-12)
+%! assert (rotz (90), [0 -1 0; 1 0 0; 0 0 1], 1e-12)
+%! assert (rotz (180), [-1 0 0; 0 -1 0; 0 0 1], 1e-12)
+
+## Test input validation
+%!error rotz ()
+%!error rotz (1, 2)
+%!error rotz ([1 2 3])
