Main Page | Modules | Class List | Directories | File List | Class Members | File Members

rotate3D.h

Go to the documentation of this file.
00001 
00014 /* This library is free software; you can redistribute it and/or
00015    modify it under the terms of the GNU Lesser General Public
00016    License as published by the Free Software Foundation; either
00017    version 2.1 of the License, or (at your option) any later version.
00018 
00019    This library is distributed in the hope that it will be useful,
00020    but WITHOUT ANY WARRANTY; without even the implied warranty of
00021    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00022    Lesser General Public License for more details.
00023 
00024    You should have received a copy of the GNU Lesser General Public
00025    License along with this library; if not, write to the Free Software
00026    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00027 */
00028 
00029 #ifndef _GAN_ROTATE3D_H
00030 #define _GAN_ROTATE3D_H
00031 
00032 #include <stdarg.h>
00033 #include <gandalf/linalg/3vector.h>
00034 #include <gandalf/linalg/4vector.h>
00035 #include <gandalf/linalg/3x3matrix.h>
00036 #include <gandalf/linalg/3x4matrix.h>
00037 #include <gandalf/linalg/4x4matrix.h>
00038 
00039 #ifdef __cplusplus
00040 extern "C" {
00041 #endif
00042 
00056 typedef enum
00057 {
00059    GAN_ROT3D_QUATERNION,
00060 
00062    GAN_ROT3D_EXPONENTIAL,
00063 
00065    GAN_ROT3D_ANGLE_AXIS,
00066 
00068    GAN_ROT3D_MATRIX
00069 } Gan_Rot3D_Type;
00070 
00074 typedef struct Gan_Quaternion
00075 {
00076    double q0; 
00077    double q1; 
00078    double q2; 
00079    double q3; 
00080 } Gan_Quaternion;
00081 
00085 typedef struct Gan_Rot3D
00086 {
00088    Gan_Rot3D_Type type;
00089 
00091    union
00092    {
00094       Gan_Quaternion q;
00095 
00097       Gan_Vector3 r;
00098 
00100       struct { Gan_Vector3 axis; double angle; } aa;
00101 
00103       Gan_Matrix33 R;
00104    } data;
00105 } Gan_Rot3D;
00106 
00110 typedef struct Gan_Rot3D_Cov
00111 {
00113    Gan_Rot3D_Type type;
00114 
00116    union
00117    {
00119       Gan_SquMatrix44 q;
00120 
00122       Gan_SquMatrix33 r;
00123    } data;
00124 } Gan_Rot3D_Cov;
00125 
00126 /* quaternion functions */
00127 
00128 void           gan_quat_fill_q ( Gan_Quaternion *q,
00129                                  double q0, double q1,
00130                                  double q2, double q3 );
00131 Gan_Quaternion gan_quat_fill_s ( double q0, double q1,
00132                                  double q2, double q3 );
00133 Gan_Quaternion gan_quat_scale_s  ( Gan_Quaternion *q, double s );
00134 Gan_Quaternion gan_quat_divide_s ( Gan_Quaternion *q, double s );
00135 Gan_Quaternion gan_quat_unit_s ( Gan_Quaternion *q );
00136 
00142 Gan_Quaternion *gan_quat_scale_q ( Gan_Quaternion *q1, double s,
00143                                    Gan_Quaternion *q2 );
00144 
00150 Gan_Quaternion *gan_quat_scale_i ( Gan_Quaternion *q1, double s );
00151 
00157 Gan_Quaternion *gan_quat_divide_q ( Gan_Quaternion *q1, double s,
00158                                     Gan_Quaternion *q2 );
00159 
00165 Gan_Quaternion *gan_quat_divide_i ( Gan_Quaternion *q1, double s );
00166 
00172 Gan_Quaternion *gan_quat_unit_q ( Gan_Quaternion *q1, Gan_Quaternion *q2 );
00173 
00179 Gan_Quaternion *gan_quat_unit_i ( Gan_Quaternion *q1 );
00180 
00186 double gan_quat_sqrlen_q ( Gan_Quaternion *q1 );
00187 
00193 double gan_quat_sqrlen_s ( Gan_Quaternion *q1 );
00194 
00200 Gan_Quaternion *gan_quat_add_q ( Gan_Quaternion *q1, Gan_Quaternion *q2,
00201                                  Gan_Quaternion *q3 );
00202 
00208 Gan_Quaternion *gan_quat_sub_q ( Gan_Quaternion *q1, Gan_Quaternion *q2,
00209                                  Gan_Quaternion *q3 );
00210 
00211 Gan_Bool gan_rot3D_build_quaternion ( Gan_Rot3D *rot,
00212                                       double q0, double q1,
00213                                       double q2, double q3 );
00214 Gan_Bool gan_rot3D_build_exponential ( Gan_Rot3D *rot,
00215                                        double rx, double ry, double rz );
00216 Gan_Bool gan_rot3D_build_angle_axis ( Gan_Rot3D *rot,
00217                                       double angle,
00218                                       double ax, double ay, double az );
00219 Gan_Bool gan_rot3D_build_matrix ( Gan_Rot3D *rot,
00220                                   double Rxx, double Rxy, double Rxz,
00221                                   double Ryx, double Ryy, double Ryz,
00222                                   double Rzx, double Rzy, double Rzz );
00223 Gan_Bool  gan_rot3D_ident_q ( Gan_Rot3D *rot, Gan_Rot3D_Type type );
00224 Gan_Rot3D gan_rot3D_ident_s ( Gan_Rot3D_Type type );
00225 Gan_Bool  gan_rot3D_apply_v3_q ( Gan_Rot3D *rot,
00226                                  Gan_Vector3 *X, Gan_Vector3 *X_new );
00227 Gan_Vector3 gan_rot3D_apply_v3_s ( Gan_Rot3D *rot, Gan_Vector3 *X );
00228 Gan_Bool  gan_rot3D_mult_q ( Gan_Rot3D *rot1, Gan_Rot3D *rot2,
00229                              Gan_Rot3D *rot3 );
00230 Gan_Rot3D gan_rot3D_mult_s ( Gan_Rot3D *rot1, Gan_Rot3D *rot2 );
00231 Gan_Bool  gan_rot3D_multI_q ( Gan_Rot3D *rot1, Gan_Rot3D *rot2,
00232                               Gan_Rot3D *rot3 );
00233 Gan_Rot3D gan_rot3D_multI_s ( Gan_Rot3D *rot1, Gan_Rot3D *rot2 );
00234 Gan_Bool  gan_rot3D_scale_q ( Gan_Rot3D *rot_s, double scale,
00235                               Gan_Rot3D *rot_d );
00236 Gan_Rot3D gan_rot3D_scale_s ( Gan_Rot3D *rot_s, double scale );
00237 Gan_Bool  gan_rot3D_divide_q ( Gan_Rot3D *rot_s, double scale,
00238                               Gan_Rot3D *rot_d );
00239 Gan_Rot3D gan_rot3D_divide_s ( Gan_Rot3D *rot_s, double scale );
00240 Gan_Bool  gan_rot3D_add_q ( Gan_Rot3D *rot1, Gan_Rot3D *rot2, Gan_Rot3D *rot3);
00241 Gan_Rot3D gan_rot3D_add_s ( Gan_Rot3D *rot1, Gan_Rot3D *rot2 );
00242 Gan_Bool  gan_rot3D_sub_q ( Gan_Rot3D *rot1, Gan_Rot3D *rot2, Gan_Rot3D *rot3);
00243 Gan_Rot3D gan_rot3D_sub_s ( Gan_Rot3D *rot1, Gan_Rot3D *rot2 );
00244 Gan_Bool  gan_rot3D_convert_q ( Gan_Rot3D *rot_s, Gan_Rot3D_Type type,
00245                                 Gan_Rot3D *rot_d );
00246 Gan_Rot3D gan_rot3D_convert_s ( Gan_Rot3D *rot_s, Gan_Rot3D_Type type );
00247 Gan_Bool  gan_rot3D_from_quaternion_q ( Gan_Rot3D *rot,
00248                                       Gan_Quaternion *q, Gan_Rot3D_Type type );
00249 Gan_Bool  gan_rot3D_from_exponential_q ( Gan_Rot3D *rot,
00250                                          Gan_Vector3 *r, Gan_Rot3D_Type type );
00251 Gan_Rot3D gan_rot3D_from_quaternion_s ( Gan_Quaternion *q,
00252                                         Gan_Rot3D_Type type );
00253 Gan_Rot3D gan_rot3D_from_exponential_s ( Gan_Vector3 *r, Gan_Rot3D_Type type );
00254 Gan_Bool  gan_rot3D_from_angle_axis_q ( Gan_Rot3D *rot,
00255                                         double angle, Gan_Vector3 *axis,
00256                                         Gan_Rot3D_Type type );
00257 Gan_Rot3D gan_rot3D_from_angle_axis_s ( double angle, Gan_Vector3 *axis,
00258                                         Gan_Rot3D_Type type );
00259 Gan_Bool  gan_rot3D_from_matrix_q ( Gan_Rot3D *rot,
00260                                     Gan_Matrix33 *R, Gan_Rot3D_Type type );
00261 Gan_Rot3D gan_rot3D_from_matrix_s ( Gan_Matrix33 *R, Gan_Rot3D_Type type );
00262 Gan_Bool  gan_rot3D_matrix_adjust ( Gan_Matrix33 *R );
00263 
00269 Gan_Bool gan_rot3D_scale_i ( Gan_Rot3D *rot, double s );
00270 
00276 Gan_Bool gan_rot3D_divide_i ( Gan_Rot3D *rot, double s );
00277 
00284 Gan_Bool gan_rot3D_increment ( Gan_Rot3D *rot1, Gan_Rot3D *rot2 );
00285 
00292 Gan_Bool gan_rot3D_add_i2 ( Gan_Rot3D *rot1, Gan_Rot3D *rot2 );
00293 
00300 Gan_Bool gan_rot3D_decrement ( Gan_Rot3D *rot1, Gan_Rot3D *rot2 );
00301 
00308 Gan_Bool gan_rot3D_sub_i2 ( Gan_Rot3D *rot1, Gan_Rot3D *rot2 );
00309 
00318 #ifdef __cplusplus
00319 }
00320 #endif
00321 
00322 #endif /* #ifndef _GAN_ROTATE3D_H */

Generated on Sat May 21 23:52:48 2005 by  doxygen 1.4.3