|  | 
 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. Quaternions have a real component
    r and an imaginary vector component v=(i,j,k). Quaternions add
    componentwise and multiply according to the rule (r,v)(s,w)=(rs-v.w,
    rw+vs+vxw), where . and x are the ordinary vector dot and cross
    products. The multiplicative inverse of a non-zero quaternion
    (r,v) is (r,-v)/(r2-v.v). 
    
    
    The following routines do arithmetic on quaternions, represented
    as 
 Name   Description|  |  |  | typedef struct Quaternion Quaternion; struct Quaternion{
 };
 
 | 
 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 vector)
    can be represented by the unit quaternion q=(cos θ/2, Asin θ/2).
    The same rotation is represented by -q; a rotation by -θ about -A
    is the same as a rotation by θ about A. The quaternion q transforms
    points by (0,x’,y’,z’) = q-1(0,x,y,z)q. Quaternion multiplication
    composes rotations. The
    orientation of an object in 3-space can be represented 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(3)) to a unit quaternion.
 qtom   Convert a unit quaternion to a rotation matrix.
 slerp   Spherical lerp. Interpolate between two orientations. The
    rotation that carries q to r is q-1r, so slerp(q, r, t) is q(q-1r)t.
 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     
 SEE ALSO    
 BUGS     
 |  |  |  | To avoid name conflicts with NetBSD, qdiv is a preprocessor macro
    defined as p9qdiv; see intro(3). 
 | 
 |  |