axis_angle.c 448 B

123456789101112131415161718
  1. #include "axis_angle.h"
  2. #include "helpler_funtions.h"
  3. #include "math.h"
  4. void AxisAngle_ByQuaternion(const float Q[4], float axisAngle[3]) {
  5. float q_imag[3] = {Q[1], Q[2], Q[3]};
  6. float q_imag_mag = get_norm3(q_imag[0], q_imag[1], q_imag[2]);
  7. float r;
  8. if (q_imag_mag > 1e-10) {
  9. r = 2 * atan2f(q_imag_mag, Q[0]) / q_imag_mag;
  10. } else {
  11. r = 2 * sign(Q[0]);
  12. }
  13. for (int i = 0; i < 3; ++i) {
  14. axisAngle[i] = r * q_imag[i];
  15. }
  16. }