#include "ell.h"
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 _ELL_AA_TO_Q | ( | type | ) |
#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 |
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] | |||
) |