| 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).