M_Quaternion —
    Agar-Math quaternion
#include <agar/core.h>
#include <agar/gui.h>
#include <agar/math/m.h>
 
The M_Quaternion structure describes a
    quaternion. Quaternions are a non-commutative extension of complex numbers
    (see
    M_Complex(3)).
    Quaternions provide a convenient way of representing and concatenating
    rotations. The structure is defined as:
typedef struct m_quaternion {
	M_Real w, x, y, z;
} M_Quaternion;
 
void
  
  M_QuaternionpToAxisAngle(const
    M_Quaternion *q,
    M_Vector3 *axis,
    M_Real *theta);
  
  void
  
  M_QuaternionpToAxisAngle3(const
    M_Quaternion *q, M_Real
    *theta, M_Real *x,
    M_Real *y,
    M_Real *z);
  
  M_Quaternion
  
  M_QuaternionFromAxisAngle(M_Vector3
    axis, M_Real
    theta);
  
  M_Quaternion
  
  M_QuaternionFromAxisAngle3(M_Real
    theta, M_Real x,
    M_Real y,
    M_Real z);
  
  void
  
  M_QuaternionpFromAxisAngle(M_Quaternion
    *q, M_Vector3 axis,
    M_Real theta);
  
  void
  
  M_QuaternionpFromAxisAngle3(M_Quaternion
    *q, M_Real theta,
    M_Real x,
    M_Real y,
    M_Real z);
  
  void
  
  M_QuaternionFromEulv(M_Quaternion
    *q, M_Real a,
    M_Real b,
    M_Real c);
  
  M_Quaternion
  
  M_QuaternionFromEul(M_Real
    a, M_Real b,
    M_Real c);
  
  void
  
  M_QuaternionToMatrix44(M_Matrix44
    *A, const M_Quaternion
    *q);
The
    M_QuaternionpToAxisAngle()
    function obtains a rotation in axis-angle format from a quaternion
    q. The axis is returned into v
    and angle into theta. The
    M_QuaternionpToAxisAngle3() variant returns the axis
    into x, y and
    z.
M_QuaternionFromAxisAngle()
    returns a quaternion describing a rotation of theta
    radians about the axis vector. The
    M_QuaternionFromAxisAngle3() form accepts individual
    x, y, z
    arguments.
The
    M_QuaternionpFromAxisAngle()
    and M_QuaternionpFromAxisAngle3() variants write the
    resulting quaternion into q as opposed to returning
    it.
M_QuaternionFromEulv()
    and M_QuaternionFromEul() return a quaternion
    describing a rotation given the set of Euler angles.
M_QuaternionToMatrix44()
    converts the rotation described by quaternion q into a
    4x4 matrix A.
void
M_Quaternion
  
  M_QuaternionConj(M_Quaternion
    q);
  
  M_Quaternion
  
  M_QuaternionConjp(const
    M_Quaternion *q);
  
  void
  
  M_QuaternionConjv(M_Quaternion
    *q);
  
  M_Quaternion
  
  M_QuaternionScale(M_Quaternion
    q, M_Real c);
  
  M_Quaternion
  
  M_QuaternionScalep(const
    M_Quaternion *q, M_Real
    c);
  
  void
  
  M_QuaternionScalev(M_Quaternion
    *q, M_Real c);
  
  M_Quaternion
  
  M_QuaternionConcat(const
    M_Quaternion *q1, const
    M_Quaternion *q2);
  
  M_Quaternion
  
  M_QuaternionMult(M_Quaternion
    q1, M_Quaternion
    q2);
  
  M_Quaternion
  
  M_QuaternionMultp(const
    M_Quaternion *q1, const
    M_Quaternion *q2);
  
  void
  
  M_QuaternionMultv(M_Quaternion
    *q, const M_Quaternion
    *q1, const M_Quaternion
    *q2);
  
  M_Quaternion
  
  M_QuaternionNormp(const
    M_Quaternion *q);
  
  void
  
  M_QuaternionNormv(M_Quaternion
    *q);
  
  M_Quaternion
  
  M_QuaternionInverse(M_Quaternion
    q);
  
  M_Quaternion
  
  M_QuaternionInversep(const
    M_Quaternion *q);
  
  void
  
  M_QuaternionInversev(M_Quaternion
    *q);
  
  M_Quaternion
  
  M_QuaternionSLERP(M_Quaternion
    q1, M_Quaternion
    q2, M_Real c);
  
  M_Quaternion
  
  M_QuaternionSLERPp(const
    M_Quaternion *q1, const
    M_Quaternion *q2, M_Real
    c);
M_QuaternionConj(),
    M_QuaternionConjp() and
    M_QuaternionConjv() return the conjugate of
    q.
M_QuaternionScale(),
    M_QuaternionScalep() and
    M_QuaternionScalev() return the quaternion
    q scaled by factor c.
M_QuaternionConcat()
    concatenates the rotations described by q1 and
    q2 and returns the resulting quaternion.
M_QuaternionMult(),
    M_QuaternionMultp() and
    M_QuaternionMultv() compute the product of
    q1 and q2.
M_QuaternionNormp()
    and M_QuaternionNormv() return the normalized form
    of q (equivalent to normalizing
    q as a vector).
M_QuaternionInverse(),
    M_QuaternionInversep() and
    M_QuaternionInversev() return the inverse (i.e., the
    normalized form of the conjugate) of q.
The functions
    M_QuaternionSLERP()
    and M_QuaternionSLERPp() perform spherical linear
    interpolation (SLERP) between q1 and
    q2, by factor c, and returns the
    result.
The M_Quaternion structure first appeared
    in Agar 1.3.4.