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 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. Quater- nions have a real component r and an imaginary vector compo- nent 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 non-zero quaternion (r,v) is (r,-v)/(r2-v.v). The following routines do arithmetic on quaternions, repre- sented as typedef struct Quaternion Quaternion; Page 1 Plan 9 (printed 12/30/24) QUATERNION(9.2) QUATERNION(9.2) 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 vec- tor) can be represented by the unit quaternion q=(cos θ/2, Asin θ/2). The same rotation is represented by -q; a rota- tion 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 rota- tions. The orientation of an object in 3-space can be rep- resented 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 quaternion. qtom Convert a unit quaternion to a rotation matrix. slerp Spherical lerp. Interpolate between two orienta- tions. 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 /sys/src/libgeometry/quaternion.c SEE ALSO tstack(9.2), qball(9.2) Page 2 Plan 9 (printed 12/30/24)