69 #define AA_TF_DEF_SERIES(name, a0, a1, a2)                  \ 
   70     static inline double                                    \ 
   71     aa_tf_ ## name ##_series2(double theta2)                \ 
   73         return aa_horner3( theta2, a0, a1, a2 );            \ 
   75     static inline double                                    \ 
   76     aa_tf_ ## name ## _series(double theta)                 \ 
   78         return aa_tf_ ## name ## _series2(theta*theta);     \ 
   81 AA_TF_DEF_SERIES( sinc, 1., -1./6, 1./120 )
 
   82 AA_TF_DEF_SERIES( cos, 1., -1./2, 1./24 )
 
   83 AA_TF_DEF_SERIES( invsinc, 1., 1./6, 7./360 )
 
   86 aa_tf_sinccos2( 
double theta2, 
double *sc, 
double *c )
 
   88     if( theta2 < sqrt(DBL_EPSILON) ) {
 
   89         *sc = aa_tf_sinc_series2(theta2);
 
   90         *c = aa_tf_cos_series2(theta2);
 
   92         double theta = sqrt(theta2);
 
   93         double s = sin(theta);
 
  100 aa_tf_sinccos( 
double theta, 
double *sc, 
double *c )
 
  102     if( theta*theta < sqrt(DBL_EPSILON) ) {
 
  103         *sc = aa_tf_sinc_series(theta);
 
  104         *c = aa_tf_cos_series(theta);
 
  106         double s = sin(theta);
 
  113 aa_tf_sinc( 
double theta )
 
  115     if( fabs(theta) < sqrt(sqrt(DBL_EPSILON)) ) {
 
  116         return aa_tf_sinc_series(theta);
 
  118         return sin(theta)/theta;
 
  180 #define AA_TF_QUAT_V 0 
  181 #define AA_TF_QUAT_XYZ AA_TF_QUAT_V 
  183 #define AA_TF_QUAT_X (AA_TF_QUAT_V + AA_TF_X) 
  185 #define AA_TF_QUAT_Y (AA_TF_QUAT_V + AA_TF_Y) 
  187 #define AA_TF_QUAT_Z (AA_TF_QUAT_V + AA_TF_Z) 
  189 #define AA_TF_QUAT_W 3 
  253 #define AA_TF_TFMAT_R 0 
  258 #define AA_TF_TFMAT_V 9 
  263 #define AA_TF_TFMAT_X 9 
  268 #define AA_TF_TFMAT_Y 10 
  273 #define AA_TF_TFMAT_Z 11 
  333 #define AA_TF_QUTR_Q  0 
  334 #define AA_TF_QUTR_QX (AA_TF_QUTR_Q + AA_TF_QUAT_X) 
  336 #define AA_TF_QUTR_QY (AA_TF_QUTR_Q + AA_TF_QUAT_Y) 
  338 #define AA_TF_QUTR_QZ (AA_TF_QUTR_Q + AA_TF_QUAT_Z) 
  340 #define AA_TF_QUTR_QW (AA_TF_QUTR_Q + AA_TF_QUAT_W) 
  344 #define AA_TF_QUTR_T  4 
  345 #define AA_TF_QUTR_TX (AA_TF_QUTR_T + AA_TF_X) 
  347 #define AA_TF_QUTR_TY (AA_TF_QUTR_T + AA_TF_Y) 
  349 #define AA_TF_QUTR_TZ (AA_TF_QUTR_T + AA_TF_Z) 
  353 #define AA_TF_DUQU_REAL 0 
  354 #define AA_TF_DUQU_DUAL 4 
  358 #define AA_TF_DUQU_REAL_W    (AA_TF_DUQU_REAL + AA_TF_QUAT_W) 
  359 #define AA_TF_DUQU_REAL_XYZ  (AA_TF_DUQU_REAL + AA_TF_QUAT_XYZ) 
  361 #define AA_TF_DUQU_REAL_X  (AA_TF_DUQU_REAL + AA_TF_QUAT_X) 
  363 #define AA_TF_DUQU_REAL_Y  (AA_TF_DUQU_REAL + AA_TF_QUAT_Y) 
  365 #define AA_TF_DUQU_REAL_Z  (AA_TF_DUQU_REAL + AA_TF_QUAT_Z) 
  369 #define AA_TF_DUQU_DUAL_W    (AA_TF_DUQU_DUAL + AA_TF_QUAT_W) 
  370 #define AA_TF_DUQU_DUAL_XYZ  (AA_TF_DUQU_DUAL + AA_TF_QUAT_XYZ) 
  372 #define AA_TF_DUQU_DUAL_X  (AA_TF_DUQU_DUAL + AA_TF_QUAT_X) 
  374 #define AA_TF_DUQU_DUAL_Y  (AA_TF_DUQU_DUAL + AA_TF_QUAT_Y) 
  376 #define AA_TF_DUQU_DUAL_Z  (AA_TF_DUQU_DUAL + AA_TF_QUAT_Z) 
  380 #define AA_TF_EPSILON .0001 
  387 #define AA_TF_IDENT_INITIALIZER {1,0,0, 0,1,0, 0,0,1, 0,0,0} 
  392 #define AA_TF_ROTMAT_IDENT_INITIALIZER {1,0,0, 0,1,0, 0,0,1} 
  397 #define AA_TF_QUAT_IDENT_INITIALIZER {0,0,0,1} 
  402 #define AA_TF_DUQU_IDENT_INITIALIZER {0,0,0,1, 0,0,0,0} 
  407 #define AA_TF_QUTR_IDENT_INITIALIZER {0,0,0,1, 0,0,0} 
  412 #define AA_TF_AXANG_IDENT_INITIALIZER {1,0,0,0} 
  417 #define AA_TF_ROTVEC_IDENT_INITIALIZER {0,0,0} 
  422 #define AA_TF_VEC_IDENT_INITIALIZER {0,0,0} 
  425 #define AA_TF_IDENT ( (double[12]) AA_TF_IDENT_INITIALIZER ) 
  426 #define AA_TF_ROTMAT_IDENT ( (double[9] AA_TF_ROTMAT_IDENT_INITIALIZER ) 
  428 #define AA_TF_QUAT_IDENT ( (double[4]) AA_TF_QUAT_IDENT_INITIALIZER ) 
  430 #define AA_TF_AXANG_IDENT ( (double[4]) AA_TF_AXANG_IDENT_INITIALIZER ) 
  432 #define AA_TF_ROTVEC_IDENT ( (double[3]) AA_TF_ROTVEC_IDENT_INITIALIZER ) 
  501                       const double p0[AA_RESTRICT 3],
 
  502                       double p1[AA_RESTRICT 3] );
 
  505                       const double v[AA_RESTRICT 3],
 
  506                       const double p0[AA_RESTRICT 3],
 
  507                       double p1[AA_RESTRICT 4] );
 
  510                          const double v[AA_RESTRICT 3],
 
  511                          const double p0[AA_RESTRICT 3],
 
  512                          double p1[AA_RESTRICT 4] );
 
  516                      const double p0[AA_RESTRICT 3],
 
  517                      double p1[AA_RESTRICT 4] );
 
  521                          double Ti[AA_RESTRICT 12] );
 
  524                          const double v[AA_RESTRICT 3],
 
  525                          double Ri[AA_RESTRICT 9], 
double vi[AA_RESTRICT 3] );
 
  532                            double qc[AA_RESTRICT 4], 
double vc[AA_RESTRICT 3]  );
 
  536                            const double T2[AA_RESTRICT 12],
 
  537                            double T[AA_RESTRICT 12] );
 
  541                             const double T1[AA_RESTRICT 12],
 
  542                             const double T2[AA_RESTRICT 12],
 
  547                            const double v0[AA_RESTRICT 3],
 
  548                            const double R1[AA_RESTRICT 9],
 
  549                            const double v1[AA_RESTRICT 3],
 
  550                            double R[AA_RESTRICT 9], 
double v[AA_RESTRICT 3] );
 
  553                             const double v0[AA_RESTRICT 3],
 
  554                             const double q1[AA_RESTRICT 4],
 
  555                             const double v1[AA_RESTRICT 3],
 
  556                             double q[AA_RESTRICT 4],
 
  557                             double v[AA_RESTRICT 3] );
 
  561                          const double v1[AA_RESTRICT 3],
 
  562                          const double R2[AA_RESTRICT 9],
 
  563                          const double v2[AA_RESTRICT 3],
 
  564                          double Rrel[AA_RESTRICT 9],
 
  565                          double vrel[AA_RESTRICT 3] );
 
  569                          const double T2[AA_RESTRICT 12],
 
  570                          double Trel[AA_RESTRICT 12] );
 
  576 AA_API void aa_tf_skewsym_scal2( 
double a, 
double b, 
const double u[3], 
double R[9] );
 
  579 aa_tf_skewsym_scal_c( 
const double u[
AA_RESTRICT 3],
 
  580                       const double a[AA_RESTRICT 3], 
const double b[AA_RESTRICT 3],
 
  586                               const double R1[AA_RESTRICT 9],
 
  587                               double R[AA_RESTRICT 9] );
 
  590                              const double T1[AA_RESTRICT 12],
 
  591                              double T[AA_RESTRICT 12] );
 
  594                               const double v0[AA_RESTRICT 3],
 
  595                               const double R1[AA_RESTRICT 9],
 
  596                               const double v1[AA_RESTRICT 3],
 
  597                               double R[AA_RESTRICT 9], 
double v[AA_RESTRICT 3] );
 
  603                                const double R1[AA_RESTRICT 9],
 
  604                                double R[AA_RESTRICT 9] );
 
  607                                const double R1[AA_RESTRICT 9],
 
  608                                double R[AA_RESTRICT 9] );
 
  611                               const double T1[AA_RESTRICT 12],
 
  612                               double T[AA_RESTRICT 12] );
 
  615                               const double T1[AA_RESTRICT 12],
 
  616                               double T[AA_RESTRICT 12] );
 
  619                                const double v0[AA_RESTRICT 3],
 
  620                                const double R1[AA_RESTRICT 9],
 
  621                                const double v1[AA_RESTRICT 3],
 
  622                                double R[AA_RESTRICT 9], 
double v[AA_RESTRICT 3] );
 
  625                                const double v0[AA_RESTRICT 3],
 
  626                                const double R1[AA_RESTRICT 9],
 
  627                                const double v1[AA_RESTRICT 3],
 
  628                                double R[AA_RESTRICT 9], 
double v[AA_RESTRICT 3] );
 
  633                               const double p0[AA_RESTRICT 3],
 
  634                               double p1[AA_RESTRICT 3] );
 
  637                       const double p0[AA_RESTRICT 3],
 
  638                       double p1[AA_RESTRICT 3] );
 
  641                              const double v[AA_RESTRICT 3],
 
  642                              const double p0[AA_RESTRICT 3],
 
  643                              double p1[AA_RESTRICT 4] );
 
  654                                double Ri[AA_RESTRICT 9] );
 
  665                               double Ti[AA_RESTRICT 12] );
 
  673                         const double R1[AA_RESTRICT 9],
 
  674                         double R[AA_RESTRICT 9] );
 
  677                         const double p0[AA_RESTRICT 3],
 
  678                         double p1[AA_RESTRICT 3] );
 
  682                         double Ri[AA_RESTRICT 9] );
 
  701                                    const double w[AA_RESTRICT 3], 
double dR[AA_RESTRICT 9] );
 
  705                                    const double dR[AA_RESTRICT 9], 
double w[AA_RESTRICT 3] );
 
  709                                const double w[AA_RESTRICT 3], 
double dt,
 
  710                                double R1[AA_RESTRICT 9] );
 
  716                               const double w[AA_RESTRICT 3], 
double dt,
 
  717                               double T1[AA_RESTRICT 12] );
 
  721                          const double R1[AA_RESTRICT 9], 
const double R2[AA_RESTRICT 9], ... );
 
  729                  const double y_axis[AA_RESTRICT 3],
 
  730                  double R[AA_RESTRICT 9] );
 
  736                  const double z_axis[AA_RESTRICT 3],
 
  737                  double R[AA_RESTRICT 9] );
 
  744                  const double x_axis[AA_RESTRICT 3],
 
  745                  double R[AA_RESTRICT 9] );
 
  757 #define AA_TF_DOTX(a,b) \ 
  758     ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2]) 
  796 #define AA_TF_CROSSX( a, b, c ) \ 
  797     (c)[0] =  (a)[1]*(b)[2] - (a)[2]*(b)[1]; \ 
  798     (c)[1] =  (a)[2]*(b)[0] - (a)[0]*(b)[2]; \ 
  799     (c)[2] =  (a)[0]*(b)[1] - (a)[1]*(b)[0]; \ 
  824                          double c[AA_RESTRICT 3] ) ;
 
  831                           float c[AA_RESTRICT 3] ) ;
 
  855     return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];
 
  879 AA_API void aa_tf_qminimize2( 
const double q[
AA_RESTRICT 4], 
double qmin[AA_RESTRICT 4] );
 
  887                          double r[AA_RESTRICT 4] );
 
  892                         double r[AA_RESTRICT 4] );
 
  897                        double r[AA_RESTRICT 4] );
 
  906                          const double dq[AA_RESTRICT 4],
 
  907                          double dln[AA_RESTRICT 3] );
 
  910                          const double dq[AA_RESTRICT 4],
 
  911                          double dln[AA_RESTRICT 3] );
 
  920                           const double de[AA_RESTRICT 3],
 
  921                           double dq[AA_RESTRICT 4] );
 
  924                           const double de[AA_RESTRICT 3],
 
  925                           double dq[AA_RESTRICT 4] );
 
  935 double aa_tf_qangle_rel( 
const double *q, 
const double *p );
 
  940 ( 
const double q[
AA_RESTRICT 4], 
const double p[AA_RESTRICT 4] );
 
  944                         double r[AA_RESTRICT 4] );
 
  948                         const double b[AA_RESTRICT 4],
 
  949                         double c[AA_RESTRICT 4] );
 
  953                         const double b[AA_RESTRICT 4],
 
  954                         double c[AA_RESTRICT 4] );
 
  958                         const double b[AA_RESTRICT 4],
 
  959                         double c[AA_RESTRICT 4] );
 
  963                             const double b[AA_RESTRICT 4],
 
  964                             double c[AA_RESTRICT 4] );
 
  968                            const double v[AA_RESTRICT 3],
 
  969                            double c[AA_RESTRICT 4] );
 
  973                            const double q[AA_RESTRICT 4],
 
  974                            double c[AA_RESTRICT 4] );
 
  978                          const double b[AA_RESTRICT 4],
 
  979                          double c[AA_RESTRICT 4] );
 
  983                          const double b[AA_RESTRICT 4],
 
  984                          double c[AA_RESTRICT 4] );
 
  995                         const double v[AA_RESTRICT 3],
 
  996                         double p[AA_RESTRICT 3] );
 
 1002                        const double q2[AA_RESTRICT 4],
 
 1003                        double q_rel[AA_RESTRICT 4]);
 
 1007                           const double b[AA_RESTRICT 4],
 
 1008                           double c[AA_RESTRICT 4] );
 
 1013                              const double b[AA_RESTRICT 4],
 
 1014                              double c[AA_RESTRICT 4] );
 
 1022                               const double b[AA_RESTRICT 4],
 
 1023                               double c[AA_RESTRICT 4] );
 
 1029                                  const double b[AA_RESTRICT 4],
 
 1030                                  double c[AA_RESTRICT 4] );
 
 1034                                    const double q1[
AA_RESTRICT 4], 
const double dq1[AA_RESTRICT 4],
 
 1035                                    const double q2[AA_RESTRICT 4], 
const double dq2[AA_RESTRICT 4],
 
 1036                                    double q[AA_RESTRICT 4], 
double dq[AA_RESTRICT 4] );
 
 1040                                const double q1[
AA_RESTRICT 4], 
const double q2[AA_RESTRICT 4],
 
 1041                                double u34, 
double du34,
 
 1042                                const double q3[AA_RESTRICT 4], 
const double q4[AA_RESTRICT 4],
 
 1043                                double u, 
double du,
 
 1044                                double q[AA_RESTRICT 4], 
double dq[AA_RESTRICT 4] );
 
 1048                              const double dq_dt[AA_RESTRICT 4],
 
 1049                              double v[AA_RESTRICT 3] );
 
 1053                              const double v[AA_RESTRICT 3],
 
 1054                              double dq_dt[AA_RESTRICT 4] );
 
 1058 AA_API void aa_tf_rotvec_diff2vel( 
const double v[3], 
const double dv[3],
 
 1069                            const double dq[AA_RESTRICT 4],
 
 1071                            double q1[AA_RESTRICT 4] );
 
 1082                            const double v[AA_RESTRICT 3],
 
 1084                            double q1[AA_RESTRICT 4] );
 
 1096                            const double v[AA_RESTRICT 3],
 
 1098                            double q1[AA_RESTRICT 4] );
 
 1109                          const double v[AA_RESTRICT 3],
 
 1111                          double q1[AA_RESTRICT 4] );
 
 1121                           const double dq[AA_RESTRICT 4],
 
 1123                           double q1[AA_RESTRICT 4] );
 
 1134 AA_API void aa_tf_quat_davenport_matrix
 
 1135 ( 
size_t n, 
const double *w, 
const double *q, 
size_t ldqq, 
double *M );
 
 1145 AA_API void aa_tf_quat_davenport
 
 1146 ( 
size_t n, 
const double *w, 
const double *Q, 
size_t ldq, 
double *y );
 
 1175                                  double rv_p[AA_RESTRICT 4] );
 
 1179                                   double rv_p[AA_RESTRICT 3] );
 
 1184                                const double rv_near[AA_RESTRICT 3],
 
 1185                                double rv_p[AA_RESTRICT 3] );
 
 1193                     double qc[4], 
double vc[3] );
 
 1196 #define AA_TF_QUTR_Q 0 
 1197 #define AA_TF_QUTR_V 4 
 1212 void aa_tf_qutr_mul( 
const double a[7], 
const double b[7], 
double c[7] ) ;
 
 1219                double p1[AA_RESTRICT 3] );
 
 1228 void aa_tf_qutr_mulc( 
const double a[7], 
const double b[7], 
double c[7] ) ;
 
 1231 void aa_tf_qutr_cmul( 
const double a[7], 
const double b[7], 
double c[7] ) ;
 
 1235 ( 
const double e[7], 
const double de[7], 
double dx[6] );
 
 1239 ( 
const double e[7], 
const double dx[6], 
double de[7] );
 
 1243 ( 
const double e0[7], 
const double dx[6], 
double dt, 
double e1[7] );
 
 1247 ( 
const double e0[7], 
const double de[7], 
double dt, 
double e1[7] );
 
 1251 ( 
size_t n, 
const double *w, 
const double *EE, 
size_t ldee, 
double *a );
 
 1262                               double axang[AA_RESTRICT 4] );
 
 1267                               double q[AA_RESTRICT 4] );
 
 1272                                double q[AA_RESTRICT 4] );
 
 1280                  const double v[AA_RESTRICT 3],
 
 1281                  double q[AA_RESTRICT 4] );
 
 1286                                 double rotvec[AA_RESTRICT 3] );
 
 1290                                 double axang[AA_RESTRICT 4] );
 
 1294                                double q[AA_RESTRICT 4] );
 
 1297                                double rotvec[AA_RESTRICT 3] );
 
 1302                                     const double rv_near[AA_RESTRICT 3],
 
 1303                                     double rotvec[AA_RESTRICT 3] );
 
 1307                                double rotmat[AA_RESTRICT 9] );
 
 1310                                double quat[AA_RESTRICT 4] );
 
 1314                                 double ra[AA_RESTRICT 4] );
 
 1317                                  double rv[AA_RESTRICT 3] );
 
 1321                                 double R[AA_RESTRICT 9] );
 
 1324                                  double R[AA_RESTRICT 9] );
 
 1329                            double T[AA_RESTRICT 12] ) ;
 
 1338                                    double e[AA_RESTRICT 3] );
 
 1343                                  double e[AA_RESTRICT 3] );
 
 1346 #define AA_TF_DEF_EULER(letters)                                        \ 
 1348     aa_tf_euler ## letters ## 2rotmat( double e1, double e2, double e3, \ 
 1349                                        double R[AA_RESTRICT 9] );       \ 
 1351     aa_tf_euler ## letters ## 2quat( double e1, double e2, double e3,   \ 
 1352                                     double q[AA_RESTRICT 4] ); 
 1354 AA_TF_DEF_EULER( xyz )
 
 1355 AA_TF_DEF_EULER( xzy )
 
 1357 AA_TF_DEF_EULER( yxz )
 
 1358 AA_TF_DEF_EULER( yzx )
 
 1360 AA_TF_DEF_EULER( zyx )
 
 1361 AA_TF_DEF_EULER( zxy )
 
 1363 AA_TF_DEF_EULER( xyx )
 
 1364 AA_TF_DEF_EULER( xzx )
 
 1366 AA_TF_DEF_EULER( yxy )
 
 1367 AA_TF_DEF_EULER( yzy )
 
 1369 AA_TF_DEF_EULER( zxz )
 
 1370 AA_TF_DEF_EULER( zyz )
 
 1386                      const 
double target[AA_RESTRICT 3],
 
 1387                      const 
double up[AA_RESTRICT 3],
 
 1388                      double R[AA_RESTRICT 9] );
 
 1396                     const 
double target[AA_RESTRICT 3],
 
 1397                     const 
double up[AA_RESTRICT 3],
 
 1398                     double T[AA_RESTRICT 12] );
 
 1405                const 
double target[AA_RESTRICT 3],
 
 1406                const 
double up[AA_RESTRICT 3],
 
 1407                double q[AA_RESTRICT 4] );
 
 1414                  const 
double target[AA_RESTRICT 3],
 
 1415                  const 
double up[AA_RESTRICT 3],
 
 1416                  double q[AA_RESTRICT 4],
 
 1417                  double v[AA_RESTRICT 3] );
 
 1424                    const 
double target[AA_RESTRICT 3],
 
 1425                    const 
double up[AA_RESTRICT 3],
 
 1426                    double T[AA_RESTRICT 12] );
 
 1433                             double d3[AA_RESTRICT 8] );
 
 1437                             double d3[AA_RESTRICT 8] );
 
 1441                              double d3[AA_RESTRICT 8] );
 
 1445                             double d3[AA_RESTRICT 8] );
 
 1459                              double d3[AA_RESTRICT 8] );
 
 1463                              double d3[AA_RESTRICT 8] );
 
 1485                         double p1[AA_RESTRICT 3]  );
 
 1498                            double d[AA_RESTRICT 8] ) ;
 
 1502                             double d[AA_RESTRICT 8] ) ;
 
 1506                              double d[AA_RESTRICT 8] );
 
 1510                              double d[AA_RESTRICT 8] );
 
 1514                              double d[AA_RESTRICT 8] );
 
 1518                            double q[AA_RESTRICT 4], 
double v[AA_RESTRICT 3] ) ;
 
 1521 void aa_tf_tfmat2av( const 
double T[12], 
double q[AA_RESTRICT 4], 
double v[AA_RESTRICT 3] ) ;
 
 1525                                   double t[AA_RESTRICT 8] ) ;
 
 1529                                   double dx[AA_RESTRICT 6] ) ;
 
 1533                                   double dd[AA_RESTRICT 8] ) ;
 
 1537                                  double dd[AA_RESTRICT 8] ) ;
 
 1541                                  double dx[AA_RESTRICT 6] ) ;
 
 1546                                    double twist[AA_RESTRICT 8] ) ;
 
 1555                                double dt, 
double d1[AA_RESTRICT 6] ) ;
 
 1564                              double dt, 
double d1[AA_RESTRICT 6] ) ;
 
 1573                               double dt, 
double d1[AA_RESTRICT 6] ) ;
 
 1580 void aa_tf_relx_mean( 
size_t n, const 
double *R,
 
 1581                       const 
double *X, 
size_t ldx,
 
 1582                       const 
double *Y, 
size_t ldy,
 
 1585 void aa_tf_relx_median( 
size_t n, const 
double *R,
 
 1586                         const 
double *X, 
size_t ldx,
 
 1587                         const 
double *Y, 
size_t ldy,
 
AA_API void aa_tf_qminimize(double q[AA_RESTRICT 4])
Minimize angle represented by the quaternion. 
void aa_tf_qutr_sdiff(const double e0[7], const double de[7], double dt, double e1[7])
Integrate a quaternion-translation. 
AA_API void aa_tf_qv_mzlook(const double eye[AA_RESTRICT 3], const double target[AA_RESTRICT 3], const double up[AA_RESTRICT 3], double q[AA_RESTRICT 4], double v[AA_RESTRICT 3])
Find the camera frame, looking in negative z direction. 
static double AA_TF_QDOT(const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4])
Inlined quaternion dot product. 
AA_API void aa_tf_duqu_mul(const double d1[AA_RESTRICT 8], const double d2[AA_RESTRICT 8], double d3[AA_RESTRICT 8])
Dual quaternion multiplication. 
AA_API void aa_tf_duqu_twist2vel(const double d[AA_RESTRICT 8], const double t[AA_RESTRICT 8], double dx[AA_RESTRICT 6])
Dual quaternion twist to velocity. 
AA_API void aa_tf_tfmat_lnv(const double T[AA_RESTRICT 12], double v[AA_RESTRICT 6])
Transformation Matrix logarithm. 
AA_API void aa_tf_qduln(const double q[AA_RESTRICT 4], const double dq[AA_RESTRICT 4], double dln[AA_RESTRICT 3])
Derivative of the Unit Quaternion Logarithm. 
static const double aa_tf_rotvec_ident[3]
Identity rotation vector array. 
AA_API void aa_tf_quat2rotmat(const double quat[AA_RESTRICT 4], double rotmat[AA_RESTRICT 9])
convert quaternion to rotation matrix 
AA_API void aa_tf_yxyz2duqu(double theta, double x, double y, double z, double d[AA_RESTRICT 8])
Convert y angle and translation to dual quaternion. 
AA_API void aa_tf_tfmat_inv1(double T[AA_RESTRICT 12])
Invert a transform in place. 
AA_API void aa_tf_quat2rotvec(const double q[AA_RESTRICT 4], double rotvec[AA_RESTRICT 3])
covert quaternion to rotation vector 
AA_API void aa_tf_rotmat_inv1(double R[AA_RESTRICT 9])
Invert a rotation in place. 
static const double aa_tf_vec_ident[3]
Identity vector-3 array. 
AA_API void aa_tf_xyz2duqu(double x, double y, double z, double d[AA_RESTRICT 8])
Pure translation dual quaternion. 
AA_API void aa_tf_duqu2tfmat(const double d[AA_RESTRICT 8], double T[AA_RESTRICT 12])
Convert dual quaternion to transformation matrix. 
AA_API void aa_tf_9rot(const double R[AA_RESTRICT 9], const double p0[AA_RESTRICT 3], double p1[AA_RESTRICT 3])
rotate p0 by R 
#define AA_TF_ROTVEC_IDENT_INITIALIZER
Static initializer for an identity rotation-vector. 
struct aa_tf_vec3 aa_tf_vec3_t
Memory layout for a vector of length 3. 
aa_tf_vec3_t v
the origin vector part 
struct aa_tf_vec3 col0
column 0 
void aa_tf_qutr_svel(const double e0[7], const double dx[6], double dt, double e1[7])
Integrate a quaternion-translation. 
AA_API void aa_tf_tfmat_mzlook(const double eye[AA_RESTRICT 3], const double target[AA_RESTRICT 3], const double up[AA_RESTRICT 3], double T[AA_RESTRICT 12])
Find the camera frame, looking in negative z direction. 
void aa_tf_qutr_conj(const double a[7], double c[7])
quaternion-translation conjugate 
struct aa_tf_dx dx
velocity 
AA_API void aa_tf_9mul(const double R0[AA_RESTRICT 9], const double R1[AA_RESTRICT 9], double R[AA_RESTRICT 9])
Multiply two rotation matrices. 
AA_API void aa_tf_vecs2quat(const double u[AA_RESTRICT 3], const double v[AA_RESTRICT 3], double q[AA_RESTRICT 4])
Convert rotation between two vectors to a quaternion. 
AA_API float aa_tf_vdotf(const float a[AA_RESTRICT 3], const float b[AA_RESTRICT 3])
Vector dot product. 
AA_API void aa_tf_duqu_matrix_l(const double *q, double *M, size_t ldm)
Construct matrix for left dual quaternion multiply q*p = M*p. 
void aa_tf_qutr_mul(const double a[7], const double b[7], double c[7])
quaternion-translation multiply 
AA_API void aa_tf_qmatrix_l(const double *q, double *M, size_t ldm)
Construct matrix for left quaternion multiply q*p = M*p. 
AA_API void aa_tf_qadd(const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Quaternion addition. 
AA_API void aa_tf_qcmul(const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Quaternion conjugate a and multiply by b. 
AA_API void aa_tf_axang_make(double x, double y, double z, double theta, double axang[AA_RESTRICT 4])
copy x,y,z,theta into axang 
Memory layout for a vector of length 3. 
static const double aa_tf_rotmat_ident[9]
Identity rotation matrix array. 
struct aa_tf_vec3 vec
vector part 
AA_API void aa_tf_93rel(const double R1[AA_RESTRICT 9], const double v1[AA_RESTRICT 3], const double R2[AA_RESTRICT 9], const double v2[AA_RESTRICT 3], double Rrel[AA_RESTRICT 9], double vrel[AA_RESTRICT 3])
relative transform 
AA_API void aa_tf_vnormalizef(float v[AA_RESTRICT 3])
Normalize Vector. 
AA_API void aa_tf_qmul(const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Quaternion multiplication. 
void aa_tf_qutr_vel2diff(const double e[7], const double dx[6], double de[7])
Quaternion-translation spatial velocity to derivative. 
#define AA_TF_QUTR_IDENT_INITIALIZER
Static initializer for an identity quaternion-translation. 
static const double aa_tf_ident[12]
Identity transformation matrix array. 
AA_API void aa_tf_qmul_qv(const double q[AA_RESTRICT 4], const double v[AA_RESTRICT 3], double c[AA_RESTRICT 4])
Quaternion multiplication. 
AA_API void aa_tf_tfmat2duqu(const double T[AA_RESTRICT 12], double d[AA_RESTRICT 8])
Convert transformation matrix to dual quaternion. 
AA_API void aa_tf_quat2rotvec_near(const double q[AA_RESTRICT 4], const double rv_near[AA_RESTRICT 3], double rotvec[AA_RESTRICT 3])
covert quaternion to rotation vector minimizing distance from rv_near 
Memory layout for a transformation matrix. 
void aa_tf_duqu2qutr(const double s[8], double e[7])
dual quaternion to quaternion-translation 
#define AA_TF_IDENT_INITIALIZER
Static initializer for an identity transformation matrix. 
struct aa_tf_duqu aa_tf_duqu_t
Memory layout for a dual quaternion . 
AA_API void aa_tf_9rel(const double R1[AA_RESTRICT 9], const double R2[AA_RESTRICT 9], double Ri[AA_RESTRICT 9])
relative transform from R1 to R2 
AA_API void aa_tf_rotmat_expv(const double rv[AA_RESTRICT 3], double R[AA_RESTRICT 9])
Rotation Matrix exponential from rotation vector. 
AA_API void aa_tf_rotmat_xy(const double x_axis[AA_RESTRICT 3], const double y_axis[AA_RESTRICT 3], double R[AA_RESTRICT 9])
Construct rotation matrix from an x and y axis of the child frame. 
AA_API void aa_tf_duqu_diff2vel(const double d[AA_RESTRICT 8], const double dd[AA_RESTRICT 8], double dx[AA_RESTRICT 6])
Dual quaternion derivative to spatial velocity. 
AA_API void aa_tf_rotmat_mzlook(const double eye[AA_RESTRICT 3], const double target[AA_RESTRICT 3], const double up[AA_RESTRICT 3], double R[AA_RESTRICT 9])
Find the camera frame, looking in negative z direction. 
AA_API void aa_tf_9(const double R[AA_RESTRICT 9], const double p0[AA_RESTRICT 3], double p1[AA_RESTRICT 4])
apply a euclidean transform 
AA_API void aa_tf_duqu_matrix_r(const double *q, double *M, size_t ldm)
Construct matrix for right dual quaternion multiply p*q = M*p. 
AA_API void aa_tf_rotmat_exp_aa(const double aa[AA_RESTRICT 4], double R[AA_RESTRICT 9])
Rotation Matrix exponential from axis angle. 
struct aa_tf_quat aa_tf_quat_t
Memory layout for a quaternion, x,y,z,w order. 
AA_API void aa_tf_duqu_vel2diff(const double d[AA_RESTRICT 8], const double dx[AA_RESTRICT 6], double dd[AA_RESTRICT 8])
Dual quaternion derivative from velocity. 
AA_API void aa_tf_axang2rotmat(const double ra[AA_RESTRICT 4], double R[AA_RESTRICT 9])
convert axis angle to rotation matrix 
static const double aa_tf_duqu_ident[8]
Identity dual quaternion array. 
AA_API void aa_tf_qslerp3diff(double u12, double du12, const double q1[AA_RESTRICT 4], const double q2[AA_RESTRICT 4], double u34, double du34, const double q3[AA_RESTRICT 4], const double q4[AA_RESTRICT 4], double u, double du, double q[AA_RESTRICT 4], double dq[AA_RESTRICT 4])
Triad sequence of slerp differentiation. 
AA_API void aa_tf_qnormalize2(const double q[AA_RESTRICT 4], double qnorm[AA_RESTRICT 4])
Normailize quaternion. 
AA_API void aa_tf_qvelrk1(const double q0[AA_RESTRICT 4], const double v[AA_RESTRICT 3], double dt, double q1[AA_RESTRICT 4])
Integrate unit quaternion from angular velocity, Runge-Kutta-1 (euler) integration. 
void aa_tf_qutr2duqu(const double e[7], double s[8])
quaternion-translation to dual quaternion 
void aa_tf_qurand(double q[4])
Generate random unit quaternion. 
double aa_tf_quhypangle2(const double q[AA_RESTRICT 4], const double p[AA_RESTRICT 4])
Return the angle between unit quaterniosn in 4D space. 
AA_API void aa_tf_qutr_tf(const double E[AA_RESTRICT 7], const double p0[AA_RESTRICT 3], double p1[AA_RESTRICT 3])
Transform a point,. 
struct aa_tf_rotmat aa_tf_rotmat_t
Memory layout for a rotation matrix. 
AA_API void aa_tf_rotmat2axang(const double R[AA_RESTRICT 9], double ra[AA_RESTRICT 4])
convert rotation matrix to axis angle 
AA_API void aa_tf_qutr_mzlook(const double eye[AA_RESTRICT 3], const double target[AA_RESTRICT 3], const double up[AA_RESTRICT 3], double T[AA_RESTRICT 12])
Find the camera frame, looking in negative z direction. 
AA_API void aa_tf_qmzlook(const double eye[AA_RESTRICT 3], const double target[AA_RESTRICT 3], const double up[AA_RESTRICT 3], double q[AA_RESTRICT 4])
Find the camera frame, looking in negative z direction. 
AA_API void aa_tf_axang_permute(const double rv[AA_RESTRICT 4], int k, double rv_p[AA_RESTRICT 4])
Scales angle by k * 2 * pi. 
AA_API void aa_tf_duqu_twist2diff(const double d[AA_RESTRICT 8], const double t[AA_RESTRICT 8], double dd[AA_RESTRICT 8])
Dual quaternion twist to derivative. 
AA_API void aa_tf_qsvel(const double q0[AA_RESTRICT 4], const double v[AA_RESTRICT 3], double dt, double q1[AA_RESTRICT 4])
Integrate unit quaternion from constant angular velocity. 
AA_API void aa_tf_rotvec_permute(const double rv[AA_RESTRICT 3], int k, double rv_p[AA_RESTRICT 3])
find alternate equivalent representations of rv 
AA_API void aa_tf_zangle2rotmat(double theta_z, double R[AA_RESTRICT 9])
Angle about z axis. 
AA_API void aa_tf_yangle2quat(double theta_y, double q[AA_RESTRICT 4])
Unit quaternion for angle about y axis. 
AA_API void aa_tf_rotmat_yz(const double y_axis[AA_RESTRICT 3], const double z_axis[AA_RESTRICT 3], double R[AA_RESTRICT 9])
Construct rotation matrix from a y and z axis of the child frame. 
AA_API void aa_tf_qv2duqu(const double q[AA_RESTRICT 4], const double v[AA_RESTRICT 3], double d[AA_RESTRICT 8])
Convert orientation unit quaternion and translation vector to dual quaternion. 
AA_API void aa_tf_qv_conj(const double q[AA_RESTRICT 4], const double v[AA_RESTRICT 3], double qc[AA_RESTRICT 4], double vc[AA_RESTRICT 3])
Invert transform. 
AA_API void aa_tf_qnormalize(double q[AA_RESTRICT 4])
Normalize Quaternion. 
AA_API void aa_tf_qdpexp(const double e[AA_RESTRICT 3], const double de[AA_RESTRICT 3], double dq[AA_RESTRICT 4])
Derivative of the Pure Quaternion Exponential. 
void aa_tf_tfmat2qutr(const double T[12], double e[7])
transformation matrix to quaternion-translation 
Memory layout for a rotation matrix. 
AA_API void aa_tf_rotvec2rotmat(const double rv[AA_RESTRICT 3], double R[AA_RESTRICT 9])
convert rotatoin vector to rotation matrix 
struct aa_tf_axang aa_tf_axang_t
Axis-Angle rotation. 
AA_API void aa_tf_qvelrk4(const double q0[AA_RESTRICT 4], const double v[AA_RESTRICT 3], double dt, double q1[AA_RESTRICT 4])
Integrate unit quaternion from angular velocity, Runge-Kutta-4 (euler) integration. 
double aa_tf_qdot(const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4])
Quaternion dot product. 
AA_API void aa_tf_axang2quat2(const double axis[AA_RESTRICT 3], double angle, double q[AA_RESTRICT 4])
axis-angle to quaternion. 
AA_API void aa_tf_yangle2rotmat(double theta_y, double R[AA_RESTRICT 9])
Angle about y axis. 
AA_API void aa_tf_axang2rotvec(const double axang[AA_RESTRICT 4], double rotvec[AA_RESTRICT 3])
convert axis-angle to rotation vector 
struct aa_tf_eulerzyx aa_tf_eulerzyx_t
Memory layout for an Euler Angle in ZYX (yaw-pitch-roll) format. 
void aa_tf_qutr_rand(double E[7])
Generate random transform. 
struct aa_tf_tfmat aa_tf_tfmat_t
Memory layout for a transformation matrix. 
AA_API void aa_tf_qrot1(const double q[AA_RESTRICT 4], double v[AA_RESTRICT 3])
Quaternion point rotation, in place. 
AA_API void aa_tf_qsub(const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Quaternion subtraction. 
AA_API void aa_tf_12(const double T[AA_RESTRICT 12], const double p0[AA_RESTRICT 3], double p1[AA_RESTRICT 3])
apply a euclidean transform 
AA_API void aa_tf_duqu_ln(const double d[AA_RESTRICT 8], double e[AA_RESTRICT 8])
Dual quaternion natural logarithm. 
struct aa_tf_qv aa_tf_qv_t
Memory layout for a Transformation as rotation quaternion and translation vector. ...
AA_API void aa_tf_zxyz2duqu(double theta, double x, double y, double z, double d[AA_RESTRICT 8])
Convert z angle and translation to dual quaternion. 
AA_API void aa_tf_duqu_mulc(const double d1[AA_RESTRICT 8], const double d2[AA_RESTRICT 8], double d3[AA_RESTRICT 8])
Dual quaternion multiply d1 by conjugate of d2. 
AA_API void aa_tf_duqu_exp(const double d[AA_RESTRICT 8], double e[AA_RESTRICT 8])
Dual quaternion exponential. 
static const double aa_tf_axang_ident[4]
Identity axis-angle array. 
static const double aa_tf_vec_y[3]
A Y axis. 
AA_API void aa_tf_qmulc(const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Quaternion multiply a by conjugate b. 
AA_API void aa_tf_duqu_add(const double d1[AA_RESTRICT 8], const double d2[AA_RESTRICT 8], double d3[AA_RESTRICT 8])
Dual quaternion addition. 
AA_API void aa_tf_duqu_sdiff(const double d0[AA_RESTRICT 8], const double dd[AA_RESTRICT 8], double dt, double d1[AA_RESTRICT 6])
Dual quaternion derivative integration. 
AA_API void aa_tf_duqu_svel(const double d0[AA_RESTRICT 8], const double dx[AA_RESTRICT 6], double dt, double d1[AA_RESTRICT 6])
Dual quaternion velocity integration. 
static const double aa_tf_tfmat_ident[12]
Identity transformation matrix array. 
AA_API void aa_tf_qslerpdiffalg(double tau, const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Derivative of quaternation SLERP WRT tau, computed algebraicly. 
AA_API void aa_tf_rotmat_zx(const double z_axis[AA_RESTRICT 3], const double x_axis[AA_RESTRICT 3], double R[AA_RESTRICT 9])
Construct rotation matrix from a z and x axis of the child frame. 
AA_API void aa_tf_rotvec2quat(const double rotvec[AA_RESTRICT 3], double q[AA_RESTRICT 4])
covert rotation vector to quaternion 
Memory layout for an SE(3) velocity. 
AA_API void aa_tf_qslerpalg(double tau, const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Quaternion SLERP, computed algebraicly. 
Transform and spatial velocity. 
Memory layout for a quaternion, x,y,z,w order. 
#define AA_RESTRICT
Defined restrict keyword based on language flavor. 
static float AA_TF_VDOTF(const float a[AA_RESTRICT 3], const float b[AA_RESTRICT 3])
Inlined vector dot product. 
Memory layout for an Euler Angle in ZYX (yaw-pitch-roll) format. 
static void AA_TF_CROSS(const double a[AA_RESTRICT 3], const double b[AA_RESTRICT 3], double c[AA_RESTRICT 3])
Inlined Vector cross product. 
static const double aa_tf_vec_z[3]
A Z axis. 
AA_API void aa_tf_qmulnorm(const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Quaternion multiplication and normalize. 
AA_API void aa_tf_quat2eulerzyx(const double q[AA_RESTRICT 4], double e[AA_RESTRICT 3])
Convert quaternion to ZYX Euler Angles. 
double dv[3]
translational velocity 
AA_API void aa_tf_rotmat_lnv(const double R[AA_RESTRICT 9], double v[AA_RESTRICT 3])
Rotation Matrix logarithm. 
AA_API void aa_tf_qmatrix_r(const double *q, double *M, size_t ldm)
Construct matrix for right quaternion multiply p*q = M*p. 
double data[12]
data array 
AA_API void aa_tf_xangle2quat(double theta_x, double q[AA_RESTRICT 4])
Unit quaternion for angle about x axis. 
static const double aa_tf_vec_x[3]
An X axis. 
AA_API void aa_tf_duqu_cmul(const double d1[AA_RESTRICT 8], const double d2[AA_RESTRICT 8], double d3[AA_RESTRICT 8])
Dual quaternion multiply conjugate of d1 by d2. 
#define AA_TF_AXANG_IDENT_INITIALIZER
Static initializer for an identity axis-angle. 
AA_API void aa_tf_12rel(const double T1[AA_RESTRICT 12], const double T2[AA_RESTRICT 12], double Trel[AA_RESTRICT 12])
relative transform 
AA_API void aa_tf_vnormalize(double v[AA_RESTRICT 3])
Normalize Vector. 
Memory layout for a dual quaternion . 
AA_API void aa_tf_93(const double R[AA_RESTRICT 9], const double v[AA_RESTRICT 3], const double p0[AA_RESTRICT 3], double p1[AA_RESTRICT 4])
apply a euclidean transform 
void aa_tf_qutr_diff2vel(const double e[7], const double de[7], double dx[6])
Quaternion-translation derivative to spatial velocity. 
AA_API void aa_tf_93chain(const double R0[AA_RESTRICT 9], const double v0[AA_RESTRICT 3], const double R1[AA_RESTRICT 9], const double v1[AA_RESTRICT 3], double R[AA_RESTRICT 9], double v[AA_RESTRICT 3])
chain two transforms 
double omega[3]
rotational velocity 
#define AA_API
calling and name mangling convention for functions 
AA_API void aa_tf_xangle2rotmat(double theta_x, double R[AA_RESTRICT 9])
Angle about x axis. 
AA_API void aa_tf_duqu_diff2twist(const double d[AA_RESTRICT 8], const double dd[AA_RESTRICT 8], double twist[AA_RESTRICT 8])
Convert dual quaternion derivative to dual quaternion twist. 
AA_API void aa_tf_xxyz2duqu(double theta, double x, double y, double z, double d[AA_RESTRICT 8])
Convert x angle and translation to dual quaternion. 
#define AA_TF_DOTX(a, b)
Macro to compute a dot product of length 3 vectors. 
AA_API void aa_tf_rotmat_svel(const double R0[AA_RESTRICT 9], const double w[AA_RESTRICT 3], double dt, double R1[AA_RESTRICT 9])
Integrate rotational velocity. 
AA_API void aa_tf_duqu_sub(const double d1[AA_RESTRICT 8], const double d2[AA_RESTRICT 8], double d3[AA_RESTRICT 8])
Dual quaternion subtraction. 
AA_API void aa_tf_rotmat_inv2(const double R[AA_RESTRICT 9], double Ri[AA_RESTRICT 9])
Invert a rotation. 
AA_API double aa_tf_vdot(const double a[AA_RESTRICT 3], const double b[AA_RESTRICT 3])
Vector dot product. 
double aa_tf_qangle(const double q[AA_RESTRICT 4])
Return the angle of the quaternion. 
#define AA_TF_ROTMAT_IDENT_INITIALIZER
Static initializer for an identity rotation matrix. 
AA_API void aa_tf_tfmat_svel(const double T0[AA_RESTRICT 12], const double w[AA_RESTRICT 3], double dt, double T1[AA_RESTRICT 12])
Integrate rotational velocity. 
struct aa_tf_vec3 col2
column 2 
AA_API void aa_tf_qsdiff(const double q0[AA_RESTRICT 4], const double dq[AA_RESTRICT 4], double dt, double q1[AA_RESTRICT 4])
Integrate unit quaternion from quaternion derivative. 
AA_API void aa_tf_qrel(const double q1[AA_RESTRICT 4], const double q2[AA_RESTRICT 4], double q_rel[AA_RESTRICT 4])
Relative orientation. 
struct aa_tf_qv tf
transform 
AA_API void aa_tf_duqu_conj(const double d[AA_RESTRICT 8], double dconj[AA_RESTRICT 8])
Dual quaternion conjugate. 
static void AA_TF_CROSSF(const float a[AA_RESTRICT 3], const float b[AA_RESTRICT 3], float c[AA_RESTRICT 3])
Inlined Vector cross product. 
AA_API void aa_tf_tfmat_inv2(const double T[AA_RESTRICT 12], double Ti[AA_RESTRICT 12])
Invert a transform. 
AA_API void aa_tf_axang2quat(const double axang[AA_RESTRICT 4], double q[AA_RESTRICT 4])
axis-angle to quaternion. 
AA_API void aa_tf_qmul_vq(const double v[AA_RESTRICT 3], const double q[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Quaternion multiplication. 
AA_API void aa_tf_rotmat2rotvec(const double R[AA_RESTRICT 9], double rv[AA_RESTRICT 3])
convert axis rotation matrix to rotation vector 
AA_API void aa_tf_qln(const double q[AA_RESTRICT 4], double r[AA_RESTRICT 4])
Quaternion natural log. 
AA_API void aa_tf_cross(const double a[AA_RESTRICT 3], const double b[AA_RESTRICT 3], double c[AA_RESTRICT 3])
Vector cross product. 
AA_API void aa_tf_zangle2quat(double theta_z, double q[AA_RESTRICT 4])
Unit quaternion for angle about z axis. 
AA_API double aa_tf_qnorm(const double q[AA_RESTRICT 4])
Return norm of the quaternion. 
void aa_tf_qutr_cmul(const double a[7], const double b[7], double c[7])
quaternion-translation conjugate multiply 
AA_API void aa_tf_duqu_normalize(double d[AA_RESTRICT 8])
Dual quaternion normalization. 
AA_API void aa_tf_tf_duqu(const double d[AA_RESTRICT 8], const double p0[AA_RESTRICT 3], double p1[AA_RESTRICT 3])
Dual quaternion transformation. 
AA_API void aa_tf_quat2axang(const double q[AA_RESTRICT 4], double axang[AA_RESTRICT 4])
Quaternion to axis-angle. 
static const double aa_tf_quat_ident[4]
Identity quaternion array. 
static const double aa_tf_qutr_ident[7]
Identity quaternion-translation array. 
AA_API void aa_tf_12chain(const double T1[AA_RESTRICT 12], const double T2[AA_RESTRICT 12], double T[AA_RESTRICT 12])
chain two transforms 
void aa_tf_qutr_mulc(const double a[7], const double b[7], double c[7])
quaternion-translation conjugate multiply 
AA_API void aa_tf_duqu_trans(const double d[AA_RESTRICT 8], double v[AA_RESTRICT 3])
Extract dual quaternion translation vector. 
static double AA_TF_VDOT(const double a[AA_RESTRICT 3], const double b[AA_RESTRICT 3])
Inlined vector dot product. 
double R[9]
the rotation matrix part 
void aa_tf_qutr2tfmat(const double e[7], double T[12])
quaternion-translation to transformation matrix 
#define AA_TF_QUAT_IDENT_INITIALIZER
Static initializer for an identity quaternion. 
AA_API void aa_tf_crossf(const float a[AA_RESTRICT 3], const float b[AA_RESTRICT 3], float c[AA_RESTRICT 3])
Vector cross product. 
AA_API void aa_tf_qv2tfmat(const double q[AA_RESTRICT 4], const double v[AA_RESTRICT 3], double T[AA_RESTRICT 12])
Convert orientation unit quaternion and translation vector to transformation matrix. 
Memory layout for a Transformation as rotation quaternion and translation vector. ...
AA_API void aa_tf_qslerpdiff(double tau, const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Derivative of quaternation SLERP WRT tau. 
AA_API void aa_tf_rotmat_vel2diff(const double R[AA_RESTRICT 9], const double w[AA_RESTRICT 3], double dR[AA_RESTRICT 9])
Velocity to rotation matrix derivative. 
AA_API void aa_tf_duqu_vel2twist(const double d[AA_RESTRICT 8], const double dx[AA_RESTRICT 6], double t[AA_RESTRICT 8])
Dual quaternion twist from velocity. 
AA_API void aa_tf_duqu_minimize(double d[AA_RESTRICT 8])
Dual quaternion angle minimization. 
AA_API void aa_tf_qv_chain(const double q0[AA_RESTRICT 4], const double v0[AA_RESTRICT 3], const double q1[AA_RESTRICT 4], const double v1[AA_RESTRICT 3], double q[AA_RESTRICT 4], double v[AA_RESTRICT 3])
chain two transforms 
AA_API void aa_tf_v12chain(double T[AA_RESTRICT 12], const double T1[AA_RESTRICT 12], const double T2[AA_RESTRICT 12],...)
Varargs transform chain. 
AA_API void aa_tf_tfmat_expv(const double v[AA_RESTRICT 6], double T[AA_RESTRICT 12])
Transformation Matrix exponential. 
AA_API void aa_tf_qrot(const double q[AA_RESTRICT 4], const double v[AA_RESTRICT 3], double p[AA_RESTRICT 3])
Quaternion point rotation. 
AA_API void aa_tf_duqu_smul(const double d1[AA_RESTRICT 8], const double d2[AA_RESTRICT 8], double d3[AA_RESTRICT 8])
Dual quaternion scalar multiplication. 
AA_API void aa_tf_93inv(const double R[AA_RESTRICT 9], const double v[AA_RESTRICT 3], double Ri[AA_RESTRICT 9], double vi[AA_RESTRICT 3])
invert transform 
AA_API void aa_tf_duqu_stwist(const double d0[AA_RESTRICT 8], const double twist[AA_RESTRICT 8], double dt, double d1[AA_RESTRICT 6])
Dual quaternion twist integration. 
AA_API void aa_tf_v9mul(double R[AA_RESTRICT 9], const double R1[AA_RESTRICT 9], const double R2[AA_RESTRICT 9],...)
Vararg multiply two rotation matrices. 
AA_API void aa_tf_qslerpchaindiff(double u, double du, const double q1[AA_RESTRICT 4], const double dq1[AA_RESTRICT 4], const double q2[AA_RESTRICT 4], const double dq2[AA_RESTRICT 4], double q[AA_RESTRICT 4], double dq[AA_RESTRICT 4])
Chain-rule slerp differentiation. 
AA_API void aa_tf_duqu2qv(const double d[AA_RESTRICT 8], double q[AA_RESTRICT 4], double v[AA_RESTRICT 3])
Convert dual quaternion to orientation unit quaternion and translation vector. 
AA_API void aa_tf_rotvec2axang(const double rotvec[AA_RESTRICT 3], double axang[AA_RESTRICT 4])
convert rotation vector to axis-angle 
AA_API void aa_tf_rotvec_near(const double rv[AA_RESTRICT 3], const double rv_near[AA_RESTRICT 3], double rv_p[AA_RESTRICT 3])
Scales rv by multiple of 2pi to minimized SSD with rv_near. 
void aa_tf_qutr_wavg(size_t n, const double *w, const double *EE, size_t ldee, double *a)
Weighted average transform. 
AA_API void aa_tf_rotmat2quat(const double rotmat[AA_RESTRICT 9], double quat[AA_RESTRICT 4])
convert rotation matrix to quaternion 
struct aa_tf_vec3 col1
column 1 
AA_API void aa_tf_tf_qv(const double quat[AA_RESTRICT 4], const double v[AA_RESTRICT 3], const double p0[AA_RESTRICT 3], double p1[AA_RESTRICT 4])
apply a euclidean transform 
AA_API void aa_tf_qrk1(const double q0[AA_RESTRICT 4], const double dq[AA_RESTRICT 4], double dt, double q1[AA_RESTRICT 4])
Integrate unit quaternion, Runge-Kutta-1 (euler) integration. 
AA_API void aa_tf_qexp(const double q[AA_RESTRICT 4], double r[AA_RESTRICT 4])
Quaternion exponential. 
#define AA_TF_DUQU_IDENT_INITIALIZER
Static initializer for an identity dual quaternion. 
AA_API int aa_tf_isrotmat(const double R[AA_RESTRICT 9])
tests if R is a rotation matrix 
AA_API void aa_tf_qslerp(double tau, const double a[AA_RESTRICT 4], const double b[AA_RESTRICT 4], double c[AA_RESTRICT 4])
Quaternion SLERP. 
AA_API void aa_tf_rotmat_diff2vel(const double R[AA_RESTRICT 9], const double dR[AA_RESTRICT 9], double w[AA_RESTRICT 3])
Rotation matrix derivative to velocity. 
AA_API void aa_tf_rotmat2eulerzyx(const double R[AA_RESTRICT 9], double e[AA_RESTRICT 3])
Convert Rotation Matrix to ZYX Euler Angles. 
AA_API void aa_tf_qconj(const double q[AA_RESTRICT 4], double r[AA_RESTRICT 4])
Quaternion conjugate. 
AA_API void aa_tf_qinv(const double q[AA_RESTRICT 4], double r[AA_RESTRICT 4])
Quaternion inverse. 
AA_API void aa_tf_12inv(const double T[AA_RESTRICT 12], double Ti[AA_RESTRICT 12])
invert transform 
void aa_tf_qutr_mulnorm(const double a[7], const double b[7], double c[7])
quaternion-translation multiply and normalize 
AA_API void aa_tf_duqu_norm(const double d[AA_RESTRICT 8], double *nreal, double *ndual)
Dual quaternion norm. 
#define AA_TF_CROSSX(a, b, c)
Macro to compute the cross product of length 3 vectors. 
void aa_tf_tfmat2av(const double T[12], double q[AA_RESTRICT 4], double v[AA_RESTRICT 3])
transformation matrix to quaternion-translation