QUATERNION(9.2) QUATERNION(9.2)
NAME
qtom, mtoq, qadd, qsub, qneg, qmul, qdiv, qunit, qinv, qlen, slerp,
qmid, qsqrt  Quaternion arithmetic
SYNOPSIS
#include <<libg.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 noncommutative extension field of the Real num
bers, 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)=(rsv.w, rw+vs+vw), where
. and are the ordinary vector dot and cross products. The multiplica
tive inverse of a nonzero quaternion (r,v) is (r,v)/(r2v.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 rota
tion 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 rota
tions. 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 tstack(9.2)) to a unit quater
nion.
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.
SOURCE
/sys/src/libgeometry/quaternion.c
SEE ALSO
tstack(9.2), qball(9.2)
QUATERNION(9.2)
