Biomechanical Joint Model
 Author: Anderson Maciel

geom.h

Go to the documentation of this file.
00001 /*@#-------------------------------------------------------------------
00002  PROJECT            : ESPRIT 6709                              HUMANOID
00003  MODULE             : HUMAN DATA STRUCTURE
00004 
00005  FILE               : geom.h
00006  CREATION DATE      : 26.02.93
00007  CREATION AUTHOR(S) : R. Boulic
00008  ----------------------------------------------------------------------
00009  KEYWORD(S)         : 
00010  PUBLIC TYPE(S)     :
00011  RELATED TYPE(S)    :
00012 
00013  FUNCTIONALITY      : geometric transformations
00014  ----------------------------------------------------------------------
00015  UPDATE    $Revision: 1.7 $
00016              $Author: abaci $
00017  ----------------------------------------------------------------------
00018  LANGAGE            : ANSI-C
00019  SYSTEM             : UNIX V 4. / SGI
00020  GRAPHIC LIBRARY    : SGI GL  
00021  ----------------------------------------------------------------------
00022  LAB DIRECTOR       : D. THALMANN
00023  LAB                : EPFL- LIG
00024  ------------------------------------------------------------------#@*/
00025 
00031 # ifndef libgeom_h
00032 # define libgeom_h
00033 
00034 
00035 /*
00036 ** -------------------------------------
00037 ** -- Include of Header files ----------
00038 ** -------------------------------------
00039 */
00040 
00041 #include        <stdio.h>           /* for FILE type        */
00042 
00043 
00044 namespace geom {
00045 
00046 /*
00047 ** -------------------------------------
00048 ** -- Public define, typedef, functions
00049 ** -------------------------------------
00050 */
00051 #define M_PI            3.14159265358979323846
00052 #define M_PI_2          1.57079632679489661923
00053 #define LIBGEOM_REAL    double
00054 
00055 enum {  ATTRACTION_NULLE     = 0,
00056         ATTRACTION_COMPLETE  = 1,
00057         ATTRACTION_PARTIELLE = 2 };
00058 
00059 const float EPSIL_MR3D  = 0.00001f;
00060 const float EPSIL_VT3D  = 0.001f;
00061 
00062 /* some epsilon value to round off zero */
00063 
00064 #define EPSIL_ZERO      0.000001
00065 #define EPSIL_BIG_ZERO  0.00001
00066 
00067 /* index for vectors, matrices and quaternions */
00068 
00069 enum {  GEOM_X_INDEX = 0,
00070         GEOM_Y_INDEX = 1,
00071         GEOM_Z_INDEX = 2,
00072         GEOM_W_INDEX = 3 };
00073 
00074 /* m etant un pointeur sur un espace a une dimension mais utilise ici*/
00075 /* pour deux dimensions ; jmax est la taille d'une ligne (= nb de col.)*/
00076 /* le resultat correspond a :  m[i][j]       (avec int i,j,jmax)*/
00077 
00078 #define VIJ(m,i,j,jmax)         (*((m) + (i)*(jmax) + (j)))
00079 
00080 typedef LIBGEOM_REAL    MatriX[4][4];   
00081 typedef LIBGEOM_REAL    MR3D[3][3];     
00082 typedef LIBGEOM_REAL    VT3D[3];        
00083 typedef LIBGEOM_REAL    VHOM[4];        
00085 typedef MatriX  MatriX_t;
00086 typedef MR3D    MR3D_t;
00087 typedef VT3D    VT3D_t;
00088 typedef VHOM    VHOM_t;
00089 
00090 typedef LIBGEOM_REAL   QUATERNION[4];   
00093 /*----------------------------------------------------------------*/
00097 typedef struct {
00098 
00099   double *data;    
00100   int    lines;    
00102 } ARRAY1D;
00103 
00106 #define AI(array1d, line)       (*((array1d)->data + (line)))
00107 
00108 /*----------------------------------------------------------------*/
00113 typedef struct {
00114 
00115   double *data;    
00116   int    lines,    
00117          cols;     
00119 } ARRAY2D;
00120 
00123 #define AIJ(array2d, line, col) (*((array2d)->data + (col) + (line) * (array2d)->cols))
00124 
00125 /*-------------------------------------------------------------------*/
00126 /* Use the following functions instead of acos and asin, if you
00127    are not sure that your argument is in the valid range (because of
00128    numerical errors, for example). These functions clamp the argument
00129    to its valid range.
00130 */
00131 
00132  double safe_acos (double f);  
00133  double safe_asin (double f);  
00135 /*-------------------------------------------------------------------*/
00136 
00142         void    matrix_idt_ (MatriX_t matrix);
00143 
00146         void    matrix_copy (const MatriX_t src, 
00147                              MatriX_t dst);
00148 
00151         void    matrix_compose (const MR3D_t   mr, 
00152                                 const VT3D_t     vt, 
00153                                 MatriX_t matrix);
00154 
00159         void    matrix_decompose (MR3D_t   mr, 
00160                                   VT3D_t   vt, 
00161                                   const MatriX_t matrix);
00162 
00167         void    matrix_rotpart   (MatriX_t In, 
00168                                   MatriX_t Res);
00169 
00172         void    matrix_transpose (const MatriX_t a,
00173                                   MatriX_t at);
00174 
00177         void    matrix_mult_vhom (const MatriX_t a, 
00178                                   const VHOM_t   u,
00179                                   VHOM_t   v);
00180 
00194         void    matrix_mult_vt3d (const MatriX_t a, 
00195                                   const VT3D_t   u,
00196                                   VT3D_t   v);
00197 
00204         void    matrix_inverse (const MatriX_t matrix,
00205                                 MatriX_t matrix_inv);
00206 
00212         void    matrix_inverse_det (MatriX_t res,
00213                                                                 LIBGEOM_REAL    determinant,
00214                                                                 const MatriX_t source);
00215 
00218         LIBGEOM_REAL    matrix_cofactor (const MatriX_t matrix,
00219                                  int      i,
00220                                  int      j);
00221 
00224         LIBGEOM_REAL    matrix_determinant (const MatriX_t matrix);
00225 
00228         void    matrix_mult (const MatriX_t     ma,
00229                              const MatriX_t     mb,
00230                              MatriX_t   mc);    
00231 
00234         void    matrix_mult_opt (const MatriX ma, const MatriX mb, MatriX mc);
00235 
00241         bool matrix_egalite (const MatriX_t a,
00242                                   const MatriX_t b);
00243 
00250         int   matrix_attraction_idt (MatriX_t   a);
00251 
00254         int     matrix_proximite (const MatriX_t  a,
00255                                   const MatriX_t  b, 
00256                                   LIBGEOM_REAL      seuil_mr,
00257                                   LIBGEOM_REAL      seuil_vt);
00258 
00268         void   matrix_lerp (const MatriX_t a,
00269                             const MatriX_t b,
00270                             LIBGEOM_REAL    u,
00271                             MatriX   result);
00272 
00275         bool  matrix_write (const MatriX_t m, 
00276                                  FILE * f);
00277 
00280         bool  matrix_read  (MatriX_t m, 
00281                                  FILE * f);
00282 
00285 /*-------------------------------------------------------------------*/
00286 
00292         void    mr3d_idt_ (MR3D_t    mr);
00293 
00296         void    mr3d_get  (const MatriX_t  matrix, 
00297                            MR3D_t a);
00298 
00301         void    mr3d_copy (const MR3D_t src, 
00302                            MR3D_t dst);
00303 
00306         void    mr3d_load (MatriX_t matrix, 
00307                            const MR3D_t a);                      
00308 
00311         void    mr3d_transpose (const MR3D_t a,
00312                                 MR3D_t at);
00313 
00316         void    mr3d_self_transpose (MR3D_t ma);
00317 
00324         void    mr3d_perm_circ (MR3D_t a, 
00325                                 MR3D_t b);
00326 
00331         void    mr3d_opposite (MR3D_t a, 
00332                                MR3D_t b);
00333 
00338         void    mr3d_symtxy (MR3D_t a, 
00339                              MR3D_t b);
00340 
00345         void    mr3d_scale (const MR3D_t self, 
00346                             LIBGEOM_REAL scalar, 
00347                             MR3D_t res);
00348 
00352         void    mr3d_sub  (const MR3D_t left, 
00353                            const MR3D_t right, 
00354                            MR3D_t res);
00355 
00359         void    mr3d_add  (const MR3D_t left, 
00360                            const MR3D_t right, 
00361                            MR3D_t res);
00362 
00366         void    mr3d_mult (const MR3D_t a, 
00367                            const MR3D_t b, 
00368                            MR3D_t c);
00369 
00373         void    mr3d_mult_vt3d (const MR3D_t ma,
00374                                 const VT3D_t vu,
00375                                 VT3D_t  vv);
00376 
00381         void    mr3d_from_axis_angle (MR3D_t mr, 
00382                                       const VT3D_t axis);
00383 
00387         void    mr3d_to_axis_angle   (VT3D_t axis, 
00388                                       const MR3D_t mr);
00389 
00394         double  mr3d_axis_angle      (const MR3D_t mr);
00395 
00401         bool mr3d_egalite (const MR3D_t a,
00402                            const MR3D_t b,
00403                            LIBGEOM_REAL  seuil_mr = EPSIL_MR3D);
00404 
00408         int     mr3d_attraction_idt (MR3D_t a, LIBGEOM_REAL  seuil_mr);
00409 
00412         int     mr3d_attraction_ini (MR3D_t a, LIBGEOM_REAL  seuil_mr);
00413 
00418         void    mr3d_conv_xyz_mob (const MR3D_t m, 
00419                                    LIBGEOM_REAL *ang1,
00420                                    LIBGEOM_REAL *ang2,
00421                                    LIBGEOM_REAL *ang3);
00422 
00428         void    mr3d_conv_yxz_mob (const MR3D_t m, 
00429                                    LIBGEOM_REAL *ang1,
00430                                    LIBGEOM_REAL *ang2,
00431                                    LIBGEOM_REAL *ang3);
00432 
00435         void    mr3d_from_angle_seq_xyz (MR3D mx,
00436                                          LIBGEOM_REAL angX, 
00437                                          LIBGEOM_REAL angY, 
00438                                          LIBGEOM_REAL angZ);
00439 
00442         void    mr3d_from_angle_seq_yxz (MR3D mx, 
00443                                          LIBGEOM_REAL angY, 
00444                                          LIBGEOM_REAL angX, 
00445                                          LIBGEOM_REAL angZ);
00446 
00452         void    mr3d_from_two_vectors(const VT3D_t a, const VT3D_t b, MR3D R);
00453 
00459         void    mr3d_reorthogonalize (MR3D_t R, int limit);
00460 
00464         bool  mr3d_write (const MR3D_t self, FILE * f);
00465 
00469         bool  mr3d_read  (MR3D_t self, FILE * f);
00470 
00474 /*-------------------------------------------------------------------*/
00475 
00482         void    vt3d_get (const MatriX_t      matrix,
00483                           VT3D_t        v);
00484 
00488         void    vt3d_load (MatriX_t     matrix,
00489                            const VT3D_t v);
00490 
00494         void    vt3d_copy (const VT3D_t src,
00495                            VT3D_t dst);
00496 
00500         void    vt3d_set_null (VT3D_t   v);
00501 
00508         bool vt3d_normalize (const VT3D_t u,
00509                                   VT3D_t v);
00510 
00513         void    vt3d_cross   (const VT3D_t      u,
00514                               const VT3D_t      v,
00515                               VT3D_t    w);
00516 
00519         void    vt3d_scale   (const VT3D_t  scale,
00520                               const VT3D_t      u,
00521                               VT3D_t    v);
00522 
00525         LIBGEOM_REAL    vt3d_get_dot (const VT3D_t      u,
00526                               const VT3D_t      v);
00527 
00535         void    vt3d_vhom (const VT3D_t vt3d, 
00536                            VHOM_t vhom);
00537 
00544         void    vhom_vt3d (const VHOM_t vhom, 
00545                            VT3D_t vt3d);
00546 
00551         void    vt3d_let (LIBGEOM_REAL x, LIBGEOM_REAL y, LIBGEOM_REAL z, VT3D_t w);
00552 
00556         void    vt3d_add (const VT3D_t u, const VT3D_t v, VT3D_t w);
00557 
00561         void    vt3d_sub (const VT3D_t u, const VT3D_t v, VT3D_t w);
00562 
00566         void    vt3d_mult (const VT3D_t u, const VT3D_t v, VT3D_t w);
00567 
00571         void    vt3d_div (const VT3D_t u, const VT3D_t v, VT3D_t w);
00572 
00575         void    vt3d_mults (const VT3D_t v, LIBGEOM_REAL s, VT3D_t w);
00576 
00579         void    vt3d_divs (const VT3D_t v, LIBGEOM_REAL s, VT3D_t w);
00580 
00583         void  vt3d_neg (const VT3D_t src, VT3D_t dest);
00584 
00587         LIBGEOM_REAL    vt3d_get_norm (const VT3D_t v);
00588 
00593         LIBGEOM_REAL    vt3d_get_norm2 (const VT3D_t v);
00594 
00597         LIBGEOM_REAL    vt3d_get_dist (const VT3D_t u, const VT3D_t v);
00598 
00603         LIBGEOM_REAL    vt3d_get_distptline (const VT3D_t p, const VT3D_t q, const VT3D_t n);
00604 
00609         LIBGEOM_REAL    vt3d_get_distptplane (const VT3D_t p, const VT3D_t q, const VT3D_t n);
00610 
00621         void    vt3d_rotv (const VT3D_t v, LIBGEOM_REAL sa, LIBGEOM_REAL ca, char k, VT3D_t w);
00622 
00626         void    vt3d_rotvect (const VT3D_t v, const VT3D_t c, VT3D_t k, 
00627                               LIBGEOM_REAL sa, LIBGEOM_REAL ca, VT3D_t w);
00628 
00634         bool vt3d_egalite (const VT3D_t a,
00635                                 const VT3D_t b, 
00636                                 LIBGEOM_REAL    seuil_vt);
00637 
00640         int     vt3d_attraction_nul (VT3D_t a, 
00641                                      LIBGEOM_REAL  seuil_vt);
00642 
00654         bool vt3d_inside_polygon (VT3D point, VT3D *p, int N);
00655 
00662         void vt3d_lerp (const VT3D p1, const VT3D p2, LIBGEOM_REAL u, VT3D result);
00663 
00664 
00675         void vt3d_slerp (const VT3D p1, const VT3D p2, LIBGEOM_REAL u, VT3D result);
00676 
00679         bool vt3d_write (const VT3D_t self, FILE * f);
00680 
00683         bool vt3d_read  (VT3D_t self, FILE *f);
00684 
00689         void      vt3d_rotate_around_axis_angle (const VT3D  axis_angle,
00690                                                  const VT3D  v_in,
00691                                                  VT3D  v_out);
00692 
00695 /*------------------------------------------------------------------*/
00696 
00703   double        *vtn_creation(int       n);
00704   void  vtn_destr(double        *p);
00705   void  vtn_nul(double          *p, 
00706                             int         n);
00707   double        vtn_norm(const double           *p, 
00708                             int         n);
00709   double        vtn_anorm(const double  *p, 
00710                             int         n);
00711   void  vtn_copy(const double   *psrc,
00712                             double      *pdst, 
00713                             int         n);
00714   void  vtn_add(const double            *p1,
00715                 const double    *p2,
00716                             double      *pdst, 
00717                             int         n);
00718   void  vtn_sub(const double            *p1,
00719                 const double    *p2,
00720                             double      *pdst, 
00721                             int         n);
00722   void    vtn_mults (const double  *psrc, 
00723                            double  *pdst, 
00724                            int n, 
00725                            double  alpha);
00726   double        vtn_dot(const double            *p1,
00727                         const double    *p2,
00728                             int         n);
00729   double        vtn_inv(const double            *p,
00730                             double      *p_inv,
00731                             int         n);
00732 
00735 /*------------------------------------------------------------------*/
00736 
00743   double        *matmxn_creation (int   lmax,
00744                                   int   cmax);
00745   void  matmxn_destr (double    *p);
00746   void  matmxn_copy  (const double * a, double * b, int lmax, int cmax);
00747 
00748   void  matmxn_nul (double      *p, 
00749                             int         lmax,
00750                             int         cmax);
00751   void  matmxn_idt (double      *p, 
00752                             int         lmax,
00753                             int         cmax);
00754   void  matmxn_mult (const double       *a,
00755                      const double       *b,
00756                              double     *c, 
00757                              int        imax,
00758                              int        jmax,
00759                              int        kmax);
00760   void  matmxn_mult_vtn (const double   *a,
00761                          const double   *b,
00762                                  double *c, 
00763                                  int    lmax ,
00764                                  int    cmax);
00765   void    matmxn_write (double *d,
00766                               int    height,
00767                               int    width,
00768                               FILE   *f);
00769   void    matmxn_transpose (const double *src,
00770                                   double *dest,
00771                                   int    src_width,
00772                                   int    src_height);
00773   bool  matmxn_pseudo_inverse (double  *m,
00774                                           int   lmax,
00775                                           int   cmax, 
00776                                           double *mp);
00777   void matmxn_damped_least_square_inverse (double *j_inv, 
00778                                                  double *j_mat, 
00779                                                  int j_width, 
00780                                                  int j_height, 
00781                                                  double damping);
00782   void matmxn_svdcmp(double **a,int m,int n,double *w,double **v);      
00783                    /* Given a matrix a[1..m][1..n], this routine computes 
00784                       its singular value decomposition. 
00785                       A = U * W * Vt. The matrix U replaces a on output. The
00786                       diagonal matrix of singular values W is output as
00787                       vector w[1..n]. The matrix V (not the transpose Vt)
00788                       is output as v[1..n][1..n]. 
00789                       "Numerical Recipes in C", 2nd edition ! 
00790                       */
00791 
00794 /*------------------------------------------------------------------*/
00795 /*
00796  * QUATERNIONS
00797  *
00798  * References:    SIGGRAPH 93, course 60 (Ken Shoemake)
00799  *                Graphic Gems, Vol 1,2,3,4
00800  *
00801  */
00802 
00809         void  quat_set  (QUATERNION self,
00810                              LIBGEOM_REAL w, 
00811                              LIBGEOM_REAL x, 
00812                              LIBGEOM_REAL y, 
00813                              LIBGEOM_REAL z);  
00814 
00817         void  quat_set_null  (QUATERNION self); 
00818 
00821         void  quat_set_unit  (QUATERNION self); 
00822 
00825         void  quat_assign    (QUATERNION self, 
00826                               QUATERNION newQuat);      
00827 
00830         void quat_copy (const QUATERNION src,
00831                         QUATERNION dest);
00832 
00838         void  quat_get_inv      (const QUATERNION self, 
00839                                  QUATERNION inv); 
00840 
00847         void  quat_get_conj   (const QUATERNION self, 
00848                                QUATERNION conj); 
00849 
00852         LIBGEOM_REAL quat_get_norm  (const QUATERNION self);    
00853 
00856         LIBGEOM_REAL quat_get_distance (const QUATERNION left,
00857                                  const QUATERNION right); 
00858 
00861         LIBGEOM_REAL quat_get_sdistance (const QUATERNION left,
00862                                   const QUATERNION right);
00863 
00869         void  quat_neg       (QUATERNION self); 
00870 
00873         void  quat_normalize (QUATERNION self); 
00874 
00877         LIBGEOM_REAL quat_dot       (const QUATERNION left,
00878                               const QUATERNION right);
00879 
00882         void  quat_pow       (const QUATERNION self, 
00883                               LIBGEOM_REAL alpha, 
00884                               QUATERNION result); 
00885 
00888         void  quat_exp       (const QUATERNION self, 
00889                               QUATERNION result); 
00890 
00893         void  quat_ln        (const QUATERNION self, 
00894                               QUATERNION result); 
00895 
00898         void  quat_mults      (const QUATERNION self, 
00899                                LIBGEOM_REAL s, 
00900                                QUATERNION result); 
00901 
00907         void  quat_mult         (const QUATERNION left, 
00908                                  const QUATERNION right, 
00909                                  QUATERNION result);
00910 
00913         void  quat_sub        (const QUATERNION left, 
00914                                const QUATERNION right, 
00915                                QUATERNION result);
00916 
00919         void  quat_add        (const QUATERNION left, 
00920                                const QUATERNION right, 
00921                                QUATERNION result);
00922 
00926         void  quat_slerp      (const QUATERNION left,
00927                                const QUATERNION right,
00928                                LIBGEOM_REAL u, 
00929                                QUATERNION result);                              
00930 
00933         void  quat_dump      (const QUATERNION self);   
00934 
00938         void  quat_from_axis  (QUATERNION self,
00939                                const VT3D axis,
00940                                LIBGEOM_REAL angle);
00941 
00945         void  quat_from_axis_angle (QUATERNION q,
00946                                     const VT3D       axis_angle);
00947 
00951         void  quat_to_axis_angle (const QUATERNION q,
00952                                   VT3D       axis_angle);
00953 
00957         void  quat_from_matrix (const MatriX m, 
00958                                 QUATERNION result);
00959 
00963         void  quat_to_matrix   (const QUATERNION self, 
00964                                 MatriX result); 
00965 
00969         void  quat_from_mr3d   (const MR3D   m, 
00970                                 QUATERNION result);
00971 
00975         void  quat_to_mr3d     (const QUATERNION self, 
00976                                 MR3D   result); 
00977 
00978                 
00983         void quat_from_two_vectors (const VT3D       v1,
00984                                     const VT3D       v2,
00985                                     QUATERNION q);
00986 
00992         void quat_from_swing (QUATERNION q,
00993                               const LIBGEOM_REAL      swing [2]);
00994 
00995 
01001         void quat_from_swing_and_twist (QUATERNION q,
01002                                         const LIBGEOM_REAL      swing [2],
01003                                         LIBGEOM_REAL      twist);
01004 
01015         void quat_to_swing_and_twist (const QUATERNION q,
01016                                       LIBGEOM_REAL      swing [2],
01017                                       LIBGEOM_REAL      *twist);
01018 
01021 /*--------------------------------------------------------------------*/
01022 /* --------------------- array1d functions -------------------------- */
01023 
01033         ARRAY1D *array1d_creation (int lines);
01034 
01038         void array1d_destroy (ARRAY1D *array1d);
01039 
01043         void array1d_nul (ARRAY1D *array1d);
01044 
01048         double array1d_norm (ARRAY1D *array1d);
01049 
01053         double array1d_anorm (ARRAY1D *array1d);
01054 
01058         void array1d_copy (ARRAY1D *src,
01059                            ARRAY1D *dest);
01060 
01064         void array1d_add (ARRAY1D *src_left,
01065                           ARRAY1D *src_right,
01066                           ARRAY1D *dest);
01067 
01071         void array1d_sub (ARRAY1D *src_left,
01072                           ARRAY1D *src_right,
01073                           ARRAY1D *dest);
01074 
01078         void array1d_mults (ARRAY1D *src,
01079                             ARRAY1D *dest,
01080                             double  factor);
01081 
01085         double array1d_dot (ARRAY1D *src1,
01086                             ARRAY1D *src2);
01087 
01092         double array1d_inv (ARRAY1D *src,
01093                             ARRAY1D *dest);
01094 
01098         void array1d_write (ARRAY1D *a,
01099                             FILE    *file);
01100 
01103 /*--------------------------------------------------------------------*/
01104 /* ----------------------- array2d functions ------------------------ */
01105 
01116         ARRAY2D *array2d_creation (int lines,
01117                                    int cols);
01118 
01122         void array2d_destroy (ARRAY2D *array2d);
01123 
01128         int  array2d_same_size (ARRAY2D *a,
01129                                 ARRAY2D *b);
01130 
01134         void array2d_nul (ARRAY2D *array2d);
01135 
01143         void array2d_idt (ARRAY2D *array2d);
01144 
01148         void array2d_copy (ARRAY2D *src,
01149                            ARRAY2D *dest);
01150 
01161         void array2d_mult (ARRAY2D *a,
01162                            ARRAY2D *b,
01163                            ARRAY2D *dest);
01164 
01171         void array2d_add (ARRAY2D *a,
01172                           ARRAY2D *b,
01173                           ARRAY2D *dest);
01174 
01181         void array2d_sub (ARRAY2D *a,
01182                           ARRAY2D *b,
01183                           ARRAY2D *dest);
01184 
01191         void array2d_mult_array1d (ARRAY2D *array2d,
01192                                    ARRAY1D *array1d,
01193                                    ARRAY1D *dest);
01194 
01199         void array2d_scale (ARRAY2D *src,
01200                             float   scalar,
01201                             ARRAY2D *dest);
01202 
01203 
01212         void array2d_pseudo_inverse (ARRAY2D *src,
01213                                      ARRAY2D *dest);
01214 
01219         void array2d_damped_least_square_inverse (ARRAY2D *j_inv,    
01220                                                   ARRAY2D *j_mat,    
01221                                                   double  damping);
01222 
01226 void array2d_compute_LS_and_DLS_inverse (ARRAY2D *LS_inv,   /* output LS-inverse  */
01227                                          ARRAY2D *DLS_inv,  /* output DLS-inverse */
01228                                          ARRAY2D *j_mat,    /* input matrix */
01229                                          ARRAY1D *task,
01230                                          double  damping);
01231 
01235         void array2d_write (ARRAY2D *a,
01236                             FILE    *file);
01237 
01241         void array2d_set_column (ARRAY2D *array2d,
01242                                  int     column,
01243                                  double  value);
01244 
01248         void array2d_set_line (ARRAY2D *array2d,
01249                                int     line,
01250                                double  value);
01251 
01259         void array2d_transpose (ARRAY2D *src,
01260                                 ARRAY2D *dest);
01261 
01264 /*--------------------------------------------------------------------*/
01265 /* ----------------------- polynomial functions --------------------- */
01266 
01274         int polynomial_solve_quadric (double c[3], double s[2]);
01275 
01276         int polynomial_solve_cubic   (double c[4], double s[3]);
01277 
01278         int polynomial_solve_quartic (double c[5], double s[4]);
01279 
01282 }
01283 #endif

Generated on Thu Dec 1 10:13:37 2005 for COME - Biomechanical Joint Model by  doxygen 1.4.5