~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Tina6/tina-libs/tina/math/mathTran_rot3.c

Version: ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /**********
  2  *
  3  * Copyright (c) 2003, Division of Imaging Science and Biomedical Engineering,
  4  * University of Manchester, UK.  All rights reserved.
  5  * 
  6  * Redistribution and use in source and binary forms, with or without modification, 
  7  * are permitted provided that the following conditions are met:
  8  * 
  9  *   . Redistributions of source code must retain the above copyright notice, 
 10  *     this list of conditions and the following disclaimer.
 11  *    
 12  *   . Redistributions in binary form must reproduce the above copyright notice,
 13  *     this list of conditions and the following disclaimer in the documentation 
 14  *     and/or other materials provided with the distribution.
 15  * 
 16  *   . Neither the name of the University of Manchester nor the names of its
 17  *     contributors may be used to endorse or promote products derived from this 
 18  *     software without specific prior written permission.
 19  * 
 20  * 
 21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 31  * POSSIBILITY OF SUCH DAMAGE.
 32  *
 33  **********
 34  *
 35  * Program :    TINA
 36  * File    :  $Source: /home/tina/cvs/tina-libs/tina/math/mathTran_rot3.c,v $
 37  * Date    :  $Date: 2003/09/23 11:32:20 $
 38  * Version :  $Revision: 1.4 $
 39  * CVS Id  :  $Id: mathTran_rot3.c,v 1.4 2003/09/23 11:32:20 matts Exp $
 40  *
 41  * Author  :  Legacy TINA
 42  *
 43  * Notes : Rotation
 44  *
 45  *********
 46 */
 47 /** 
 48  *  @file
 49  *  @brief  Rotation functions for a Mat3.      
 50  *
 51  *
 52  * 
 53 */
 54 
 55 #include "mathTran_rot3.h"
 56 
 57 #if HAVE_CONFIG_H
 58 #include <config.h>
 59 #endif
 60 
 61 
 62 #include <stdio.h>
 63 #include <math.h>
 64 #include <tina/math/math_GeomDef.h>
 65 #include <tina/math/math_GeomPro.h>
 66 #include <tina/math/math_UtilPro.h>
 67 
 68 Mat3            rot3(double theta, Vec3 axis)
 69 {
 70         double          c, c1, s, a;
 71         float           nx, ny, nz;
 72         double          mxx, mxy, mxz;
 73         double          myx, myy, myz;
 74         double          mzx, mzy, mzz;
 75 
 76         a = vec3_mod(axis);
 77         if (a == 0.0)
 78                 return (mat3_unit());
 79         vec3_comps(vec3_unit(axis), &nx, &ny, &nz);
 80         c = cos(theta);
 81         s = sin(theta);
 82         c1 = 1.0 - c;
 83         mxx = c + nx * nx * c1;
 84         mxy = nx * ny * c1 - nz * s;
 85         mxz = nx * nz * c1 + ny * s;
 86         myx = ny * nx * c1 + nz * s;
 87         myy = c + ny * ny * c1;
 88         myz = ny * nz * c1 - nx * s;
 89         mzx = nz * nx * c1 - ny * s;
 90         mzy = nz * ny * c1 + nx * s;
 91         mzz = c + nz * nz * c1;
 92         return (mat3(mxx, mxy, mxz,
 93                      myx, myy, myz,
 94                      mzx, mzy, mzz));
 95 }
 96 
 97 Mat3            rot3_1(Vec3 axis)
 98 {
 99         double          theta;
100         double          c, c1, s;
101         float           nx, ny, nz;
102         double          mxx, mxy, mxz;
103         double          myx, myy, myz;
104         double          mzx, mzy, mzz;
105 
106         theta = vec3_mod(axis);
107         if (theta == 0.0)
108                 return (mat3_unit());
109         vec3_comps(vec3_unit(axis), &nx, &ny, &nz);
110         c = cos(theta);
111         s = sin(theta);
112         c1 = 1.0 - c;
113         mxx = c + nx * nx * c1;
114         mxy = nx * ny * c1 - nz * s;
115         mxz = nx * nz * c1 + ny * s;
116         myx = ny * nx * c1 + nz * s;
117         myy = c + ny * ny * c1;
118         myz = ny * nz * c1 - nx * s;
119         mzx = nz * nx * c1 - ny * s;
120         mzy = nz * ny * c1 + nx * s;
121         mzz = c + nz * nz * c1;
122         return (mat3(mxx, mxy, mxz,
123                      myx, myy, myz,
124                      mzx, mzy, mzz));
125 }
126 
127 void            rot3_angle_axis(Mat3 m, double *theta, Vec3 * axis)
128 {
129         double          c;
130         Vec3            v = {Vec3_id};
131 
132         c = 0.5 * (mat3_trace(m) - 1.0);
133         v = vec3_unit(vec3(mat3_zy(m) - mat3_yz(m),
134                            mat3_xz(m) - mat3_zx(m),
135                            mat3_yx(m) - mat3_xy(m)));
136         if (theta == NULL)
137                 *axis = vec3_times(tina_acos(c), v);
138         else
139         {
140                 *axis = v;
141                 *theta = tina_acos(c);
142         }
143 }
144 
145 Mat3            rot3_euler(double theta, double phi, double psi)
146 {
147         Mat3            r1 = {Mat3_id};
148         Mat3            r2 = {Mat3_id};
149         Mat3            r3 = {Mat3_id};
150 
151         r1 = rot3(theta, vec3_ey());
152         r2 = rot3(phi, vec3_ez());
153         r3 = rot3(psi, vec3_ez());
154         return (mat3_prod(r2, mat3_prod(r1, r3)));
155 }
156 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.