qtom, mtoq, qadd, qsub, qneg, qmul, qdiv, qunit, qinv, qlen, slerp, qmid, qsqrt
 Quaternion arithmetic
#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)
The Quaternions are a noncommutative extension field of the Real numbers,
designed to do for rotations in 3space what the complex numbers do for
rotations in 2space. 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+
v×
w), where . and × are the
ordinary vector dot and cross products. The multiplicative inverse of a
nonzero 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') =
q1(0,
x,y,z)
q. Quaternion multiplication composes
rotations. The orientation of an object in 3space 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 q1r, so slerp(q, r,
t) is q(q1r)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.
/src/libgeometry/quaternion.c
matrix(3),
qball(3)
To avoid name conflicts with NetBSD,
qdiv is a preprocessor macro defined
as
p9qdiv; see
intro(3).