| QUATERNION(3) | QUATERNION(3)
| 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
| `typedef struct Quaternion Quaternion; struct Quaternion{
| 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 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
| `/usr/local/plan9/src/libgeometry/quaternion.c`
SEE ALSO
| matrix(3), qball(3)
BUGS
| To avoid name conflicts with NetBSD, qdiv is a preprocessor macro defined as p9qdiv; see intro(3).