QUATERNION(2)                                       QUATERNION(2)

     NAME
          qtom, mtoq, qadd, qsub, qneg, qmul, qdiv, qunit, qinv, qlen,
          slerp, qmid, qsqrt - Quaternion arithmetic

     SYNOPSIS
          #include <draw.h>
          #include <geometry.h>

          Quaternion qadd(Quaternion q, Quaternion r)

          Quaternion qsub(Quaternion q, Quaternion r)

          Quaternion qneg(Quaternion q)

          Quaternion qmul(Quaternion q, Quaternion r)

          Quaternion qdiv(Quaternion q, Quaternion r)

          Quaternion qinv(Quaternion q)

          double qlen(Quaternion p)

          Quaternion qunit(Quaternion q)

          void qtom(Matrix m, Quaternion q)

          Quaternion mtoq(Matrix mat)

          Quaternion slerp(Quaternion q, Quaternion r, double a)

          Quaternion qmid(Quaternion q, Quaternion r)

          Quaternion qsqrt(Quaternion q)

     DESCRIPTION
          The Quaternions are a non-commutative extension field of the
          Real numbers, designed to do for rotations in 3-space what
          the complex numbers do for rotations in 2-space.  Quater-
          nions have a real component r and an imaginary vector compo-
          nent v=(i,j,k).  Quaternions add componentwise and multiply
          according to the rule (r,v)(s,w)=(rs-v.w, rw+vs+v×w), where
          . and × are the ordinary vector dot and cross products.  The
          multiplicative inverse of a non-zero quaternion (r,v) is
          (r,-v)/(r829-v.v).

          The following routines do arithmetic on quaternions, repre-
          sented as

               typedef struct Quaternion Quaternion;
               struct Quaternion{

     QUATERNION(2)                                       QUATERNION(2)

                     double r, i, j, k;
               };

          Name   Description
          qadd   Add two quaternions.
          qsub   Subtract two quaternions.
          qneg   Negate a quaternion.
          qmul   Multiply two quaternions.
          qdiv   Divide two quaternions.
          qinv   Return the multiplicative inverse of a quaternion.
          qlen   Return sqrt(q.r*q.r+q.i*q.i+q.j*q.j+q.k*q.k), the
                 length of a quaternion.
          qunit  Return a unit quaternion (length=1) with components
                 proportional to q's.

          A rotation by angle θ about axis A (where A is a unit vec-
          tor) can be represented by the unit quaternion q=(cos θ/2,
          Asin θ/2).  The same rotation is represented by -q; a rota-
          tion by -θ about -A is the same as a rotation by θ about A.
          The quaternion q transforms points by (0,x',y',z') =
          q8-19(0,x,y,z)q.  Quaternion multiplication composes rota-
          tions.  The orientation of an object in 3-space can be rep-
          resented by a quaternion giving its rotation relative to
          some `standard' orientation.

          The following routines operate on rotations or orientations
          represented as unit quaternions:

          mtoq   Convert a rotation matrix (see matrix(2)) to a unit
                 quaternion.
          qtom   Convert a unit quaternion to a rotation matrix.
          slerp  Spherical lerp.  Interpolate between two orienta-
                 tions.  The rotation that carries q to r is q8-19r, so
                 slerp(q, r, t) is q(q8-19r)8t9.
          qmid   slerp(q, r, .5)
          qsqrt  The square root of q. This is just a rotation about
                 the same axis by half the angle.

     SOURCE
          /sys/src/libgeometry/quaternion.c

     SEE ALSO
          matrix(2), qball(2)