src/ell/quat.c File Reference

#include "ell.h"

Include dependency graph for quat.c:


Defines

#define W   0
#define X   1
#define Y   2
#define Z   3
#define _ELL_M_TO_Q(type, i0, i1, i2, i3, i4, i5, i6, i7, i8)
#define _ELL_Q_TO_3M(type)
#define _ELL_Q_TO_4M(type)
#define _ELL_Q_TO_AA(type)
#define _ELL_AA_TO_Q(type)
#define _ELL_Q_EXP(type)
#define _ELL_Q3V_ROT(type)

Functions

void ell_3m_to_q_f (float q[4], const float m[9])
void ell_3m_to_q_d (double q[4], const double m[9])
void ell_4m_to_q_f (float q[4], const float m[16])
void ell_4m_to_q_d (double q[4], const double m[16])
void ell_q_to_3m_f (float m[9], const float q[4])
void ell_q_to_3m_d (double m[9], const double q[4])
void ell_q_to_4m_f (float m[16], const float q[4])
void ell_q_to_4m_d (double m[16], const double q[4])
float ell_q_to_aa_f (float axis[3], const float q[4])
double ell_q_to_aa_d (double axis[3], const double q[4])
void ell_aa_to_q_f (float q[4], const float angle, const float axis[3])
void ell_aa_to_q_d (double q[4], const double angle, const double axis[3])
float ell_3m_to_aa_f (float axis[3], const float m[9])
double ell_3m_to_aa_d (double axis[3], const double m[9])
float ell_4m_to_aa_f (float axis[3], const float m[16])
double ell_4m_to_aa_d (double axis[3], const double m[16])
void ell_aa_to_3m_f (float m[9], const float angle, const float axis[3])
void ell_aa_to_3m_d (double m[9], const double angle, const double axis[3])
void ell_aa_to_4m_f (float m[16], const float angle, const float axis[3])
void ell_aa_to_4m_d (double m[16], const double angle, const double axis[3])
void ell_q_mul_f (float q3[4], const float q1[4], const float q2[4])
void ell_q_mul_d (double q3[4], const double q1[4], const double q2[4])
void ell_q_inv_f (float qi[4], const float q[4])
void ell_q_inv_d (double qi[4], const double q[4])
void ell_q_div_f (float q3[4], const float q1[4], const float q2[4])
void ell_q_div_d (double q3[4], const double q1[4], const double q2[4])
void ell_q_log_f (float q2[4], const float q1[4])
void ell_q_log_d (double q2[4], const double q1[4])
void ell_q_exp_f (float q2[4], const float q1[4])
void ell_q_exp_d (double q2[4], const double q1[4])
void ell_q_pow_f (float q2[4], const float q1[4], const float p)
void ell_q_pow_d (double q2[4], const double q1[4], const double p)
void ell_q_3v_rotate_f (float v2[3], const float q[4], const float v1[3])
void ell_q_3v_rotate_d (double v2[3], const double q[4], const double v1[3])
void ell_q_4v_rotate_f (float v2[4], const float q[4], const float v1[4])
void ell_q_4v_rotate_d (double v2[4], const double q[4], const double v1[4])
int ell_q_avg4_d (double m[4], unsigned int *iterP, const double _q1[4], const double _q2[4], const double _q3[4], const double _q4[4], const double _wght[4], const double eps, const unsigned int maxIter)
int ell_q_avgN_d (double mm[4], unsigned int *iterP, const double *qq, double *qlog, const double *wght, const unsigned int NN, const double eps, const unsigned int maxIter)

Define Documentation

#define _ELL_AA_TO_Q ( type   ) 

Value:

type sa;                                                             \
                                                                       \
  sa = AIR_CAST(type, sin(angle/2));                                   \
  ELL_4V_SET(q,                                                        \
             AIR_CAST(type, cos(angle/2)), AIR_CAST(type, sa*axis[0]), \
             AIR_CAST(type, sa*axis[1]), AIR_CAST(type, sa*axis[2]))

#define _ELL_M_TO_Q ( type,
i0,
i1,
i2,
i3,
i4,
i5,
i6,
i7,
i8   ) 

Value:

type s[4], wx, wy, wz, xy, xz, yz, len; \
  int mi;                                 \
                                          \
  s[W] = 1 + m[i0] + m[i4] + m[i8];       \
  s[X] = 1 + m[i0] - m[i4] - m[i8];       \
  s[Y] = 1 - m[i0] + m[i4] - m[i8];       \
  s[Z] = 1 - m[i0] - m[i4] + m[i8];       \
  wx = m[i7] - m[i5];                     \
  wy = m[i2] - m[i6];                     \
  wz = m[i3] - m[i1];                     \
  xy = m[i3] + m[i1];                     \
  xz = m[i6] + m[i2];                     \
  yz = m[i7] + m[i5];                     \
  mi =  s[W] > s[X] ?  W : X;             \
  mi = s[mi] > s[Y] ? mi : Y;             \
  mi = s[mi] > s[Z] ? mi : Z;             \
  switch (mi) {                           \
  case W:                                 \
    ELL_4V_SET(q, s[W],  wx,  wy,  wz);   \
    break;                                \
  case X:                                 \
    ELL_4V_SET(q,  wx, s[X],  xy,  xz);   \
    break;                                \
  case Y:                                 \
    ELL_4V_SET(q,  wy,  xy, s[Y],  yz);   \
    break;                                \
  case Z:                                 \
    ELL_4V_SET(q,  wz,  xz,  yz, s[Z]);   \
    break;                                \
  }

#define _ELL_Q3V_ROT ( type   ) 

Value:

type n, a[4], b[4], c[4];              \
                                         \
  ELL_4V_SET(a, 0, v1[0], v1[1], v1[2]); \
  ELL_Q_INV(b, q, n);                    \
  ELL_Q_MUL(c, a, b);                    \
  ELL_Q_MUL(a, q, c);                    \
  ELL_3V_COPY(v2, a+1)

#define _ELL_Q_EXP ( type   ) 

Value:

type ea, b, sb, axis[3], tmp;                              \
                                                             \
  ea = AIR_CAST(type, exp(q1[0]));                           \
  b = AIR_CAST(type, ELL_3V_LEN(q1+1));                      \
  if (b) {                                                   \
    ELL_3V_SCALE(axis, 1.0f/b, q1+1);                        \
    tmp = AIR_CAST(type, ELL_3V_LEN(axis));                  \
    ELL_3V_SCALE(axis, 1.0f/tmp, axis);                      \
  } else {                                                   \
    ELL_3V_SET(axis, 1.0f, 0.0f, 0.0f);                      \
  }                                                          \
  sb = AIR_CAST(type, sin(b));                               \
  ELL_4V_SET(q2, AIR_CAST(type, ea*cos(b)), ea*sb*axis[0],   \
             ea*sb*axis[1], ea*sb*axis[2])

#define _ELL_Q_TO_3M ( type   ) 

Value:

ELL_4V_GET(w, x, y, z, u);         \
  ELL_3V_SET(m+0,                    \
             w*w + x*x - y*y - z*z,  \
             2*(x*y - w*z),          \
             2*(x*z + w*y));         \
  ELL_3V_SET(m+3,                    \
             2*(x*y + w*z),          \
             w*w - x*x + y*y - z*z,  \
             2*(y*z - w*x));         \
  ELL_3V_SET(m+6,                    \
             2*(x*z - w*y),          \
             2*(y*z + w*x),          \
             w*w - x*x - y*y + z*z)

#define _ELL_Q_TO_4M ( type   ) 

Value:

ELL_4V_GET(w, x, y, z, u);         \
  ELL_4V_SET(m+0,                    \
             w*w + x*x - y*y - z*z,  \
             2*(x*y - w*z),          \
             2*(x*z + w*y),          \
             0);                     \
  ELL_4V_SET(m+4,                    \
             2*(x*y + w*z),          \
             w*w - x*x + y*y - z*z,  \
             2*(y*z - w*x),          \
             0);                     \
  ELL_4V_SET(m+8,                    \
             2*(x*z - w*y),          \
             2*(y*z + w*x),          \
             w*w - x*x - y*y + z*z,  \
             0);                     \
  ELL_4V_SET(m+12, 0, 0, 0, 1)

#define _ELL_Q_TO_AA ( type   ) 

Value:

type len, angle;                              \
                                                \
  len = AIR_CAST(type, ELL_3V_LEN(q+1));        \
  angle = AIR_CAST(type, atan2(len, q[0]));     \
  if (len) {                                    \
    ELL_3V_SCALE(axis, 1.0f/len, q+1);          \
    len = AIR_CAST(type, ELL_3V_LEN(axis));     \
    ELL_3V_SCALE(axis, 1.0f/len, axis);         \
  } else {                                      \
    ELL_3V_SET(axis, 1, 0, 0);                  \
  }                                             \
  return 2*angle

#define W   0

#define X   1

#define Y   2

#define Z   3


Function Documentation

double ell_3m_to_aa_d ( double  axis[3],
const double  m[9] 
)

float ell_3m_to_aa_f ( float  axis[3],
const float  m[9] 
)

void ell_3m_to_q_d ( double  q[4],
const double  m[9] 
)

void ell_3m_to_q_f ( float  q[4],
const float  m[9] 
)

double ell_4m_to_aa_d ( double  axis[3],
const double  m[16] 
)

float ell_4m_to_aa_f ( float  axis[3],
const float  m[16] 
)

void ell_4m_to_q_d ( double  q[4],
const double  m[16] 
)

void ell_4m_to_q_f ( float  q[4],
const float  m[16] 
)

void ell_aa_to_3m_d ( double  m[9],
const double  angle,
const double  axis[3] 
)

void ell_aa_to_3m_f ( float  m[9],
const float  angle,
const float  axis[3] 
)

void ell_aa_to_4m_d ( double  m[16],
const double  angle,
const double  axis[3] 
)

void ell_aa_to_4m_f ( float  m[16],
const float  angle,
const float  axis[3] 
)

void ell_aa_to_q_d ( double  q[4],
const double  angle,
const double  axis[3] 
)

void ell_aa_to_q_f ( float  q[4],
const float  angle,
const float  axis[3] 
)

void ell_q_3v_rotate_d ( double  v2[3],
const double  q[4],
const double  v1[3] 
)

void ell_q_3v_rotate_f ( float  v2[3],
const float  q[4],
const float  v1[3] 
)

void ell_q_4v_rotate_d ( double  v2[4],
const double  q[4],
const double  v1[4] 
)

void ell_q_4v_rotate_f ( float  v2[4],
const float  q[4],
const float  v1[4] 
)

int ell_q_avg4_d ( double  m[4],
unsigned int *  iterP,
const double  _q1[4],
const double  _q2[4],
const double  _q3[4],
const double  _q4[4],
const double  _wght[4],
const double  eps,
const unsigned int  maxIter 
)

int ell_q_avgN_d ( double  mm[4],
unsigned int *  iterP,
const double *  qq,
double *  qlog,
const double *  wght,
const unsigned int  NN,
const double  eps,
const unsigned int  maxIter 
)

void ell_q_div_d ( double  q3[4],
const double  q1[4],
const double  q2[4] 
)

void ell_q_div_f ( float  q3[4],
const float  q1[4],
const float  q2[4] 
)

void ell_q_exp_d ( double  q2[4],
const double  q1[4] 
)

void ell_q_exp_f ( float  q2[4],
const float  q1[4] 
)

void ell_q_inv_d ( double  qi[4],
const double  q[4] 
)

void ell_q_inv_f ( float  qi[4],
const float  q[4] 
)

void ell_q_log_d ( double  q2[4],
const double  q1[4] 
)

void ell_q_log_f ( float  q2[4],
const float  q1[4] 
)

void ell_q_mul_d ( double  q3[4],
const double  q1[4],
const double  q2[4] 
)

void ell_q_mul_f ( float  q3[4],
const float  q1[4],
const float  q2[4] 
)

void ell_q_pow_d ( double  q2[4],
const double  q1[4],
const double  p 
)

void ell_q_pow_f ( float  q2[4],
const float  q1[4],
const float  p 
)

void ell_q_to_3m_d ( double  m[9],
const double  q[4] 
)

void ell_q_to_3m_f ( float  m[9],
const float  q[4] 
)

void ell_q_to_4m_d ( double  m[16],
const double  q[4] 
)

void ell_q_to_4m_f ( float  m[16],
const float  q[4] 
)

double ell_q_to_aa_d ( double  axis[3],
const double  q[4] 
)

float ell_q_to_aa_f ( float  axis[3],
const float  q[4] 
)


Generated on Sat May 9 03:55:16 2009 for Teem by  doxygen 1.5.9