groff 1.23.0 added .MR to its -man macro package. The NEWS file states
that the inclusion of the macro "was prompted by its introduction to
Plan 9 from User Space's troff in August 2020." From d32deab it seems
that the name for Plan 9 from User Space's implementation was suggested
by groff maintainer G. Brandon Robinson.
Not sure if the intention was to make these definitions compatible, but
it would be nice if they were.
Currently, Plan 9 from User Space's .MR expects its second argument to
be parenthesized. groff's .MR does not. This results in extra
parentheses appearing in manual references when viewing Plan 9 from User
Space's manual pages on a system using groff.
160 lines
3.5 KiB
Groff
160 lines
3.5 KiB
Groff
.TH QUATERNION 3
|
||
.SH NAME
|
||
qtom, mtoq, qadd, qsub, qneg, qmul, qdiv, qunit, qinv, qlen, slerp, qmid, qsqrt \- Quaternion arithmetic
|
||
.SH SYNOPSIS
|
||
.PP
|
||
.B
|
||
#include <draw.h>
|
||
.PP
|
||
.B
|
||
#include <geometry.h>
|
||
.PP
|
||
.B
|
||
Quaternion qadd(Quaternion q, Quaternion r)
|
||
.PP
|
||
.B
|
||
Quaternion qsub(Quaternion q, Quaternion r)
|
||
.PP
|
||
.B
|
||
Quaternion qneg(Quaternion q)
|
||
.PP
|
||
.B
|
||
Quaternion qmul(Quaternion q, Quaternion r)
|
||
.PP
|
||
.B
|
||
Quaternion qdiv(Quaternion q, Quaternion r)
|
||
.PP
|
||
.B
|
||
Quaternion qinv(Quaternion q)
|
||
.PP
|
||
.B
|
||
double qlen(Quaternion p)
|
||
.PP
|
||
.B
|
||
Quaternion qunit(Quaternion q)
|
||
.PP
|
||
.B
|
||
void qtom(Matrix m, Quaternion q)
|
||
.PP
|
||
.B
|
||
Quaternion mtoq(Matrix mat)
|
||
.PP
|
||
.B
|
||
Quaternion slerp(Quaternion q, Quaternion r, double a)
|
||
.PP
|
||
.B
|
||
Quaternion qmid(Quaternion q, Quaternion r)
|
||
.PP
|
||
.B
|
||
Quaternion qsqrt(Quaternion q)
|
||
.SH 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
|
||
.I r
|
||
and an imaginary vector component \fIv\fP=(\fIi\fP,\fIj\fP,\fIk\fP).
|
||
Quaternions add componentwise and multiply according to the rule
|
||
(\fIr\fP,\fIv\fP)(\fIs\fP,\fIw\fP)=(\fIrs\fP-\fIv\fP\v'-.3m'.\v'.3m'\fIw\fP, \fIrw\fP+\fIvs\fP+\fIv\fP×\fIw\fP),
|
||
where \v'-.3m'.\v'.3m' and × are the ordinary vector dot and cross products.
|
||
The multiplicative inverse of a non-zero quaternion (\fIr\fP,\fIv\fP)
|
||
is (\fIr\fP,\fI-v\fP)/(\fIr\^\fP\u\s-22\s+2\d-\fIv\fP\v'-.3m'.\v'.3m'\fIv\fP).
|
||
.PP
|
||
The following routines do arithmetic on quaternions, represented as
|
||
.IP
|
||
.EX
|
||
.ta 6n
|
||
typedef struct Quaternion Quaternion;
|
||
struct Quaternion{
|
||
double r, i, j, k;
|
||
};
|
||
.EE
|
||
.TF qunit
|
||
.TP
|
||
Name
|
||
Description
|
||
.TP
|
||
.B qadd
|
||
Add two quaternions.
|
||
.TP
|
||
.B qsub
|
||
Subtract two quaternions.
|
||
.TP
|
||
.B qneg
|
||
Negate a quaternion.
|
||
.TP
|
||
.B qmul
|
||
Multiply two quaternions.
|
||
.TP
|
||
.B qdiv
|
||
Divide two quaternions.
|
||
.TP
|
||
.B qinv
|
||
Return the multiplicative inverse of a quaternion.
|
||
.TP
|
||
.B qlen
|
||
Return
|
||
.BR sqrt(q.r*q.r+q.i*q.i+q.j*q.j+q.k*q.k) ,
|
||
the length of a quaternion.
|
||
.TP
|
||
.B qunit
|
||
Return a unit quaternion
|
||
.RI ( length=1 )
|
||
with components proportional to
|
||
.IR q 's.
|
||
.PD
|
||
.PP
|
||
A rotation by angle \fIθ\fP about axis
|
||
.I A
|
||
(where
|
||
.I A
|
||
is a unit vector) can be represented by
|
||
the unit quaternion \fIq\fP=(cos \fIθ\fP/2, \fIA\fPsin \fIθ\fP/2).
|
||
The same rotation is represented by \(mi\fIq\fP; a rotation by \(mi\fIθ\fP about \(mi\fIA\fP is the same as a rotation by \fIθ\fP about \fIA\fP.
|
||
The quaternion \fIq\fP transforms points by
|
||
(0,\fIx',y',z'\fP) = \%\fIq\fP\u\s-2-1\s+2\d(0,\fIx,y,z\fP)\fIq\fP.
|
||
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.
|
||
.PP
|
||
The following routines operate on rotations or orientations represented as unit quaternions:
|
||
.TF slerp
|
||
.TP
|
||
.B mtoq
|
||
Convert a rotation matrix (see
|
||
.MR matrix 3 )
|
||
to a unit quaternion.
|
||
.TP
|
||
.B qtom
|
||
Convert a unit quaternion to a rotation matrix.
|
||
.TP
|
||
.B slerp
|
||
Spherical lerp. Interpolate between two orientations.
|
||
The rotation that carries
|
||
.I q
|
||
to
|
||
.I r
|
||
is \%\fIq\fP\u\s-2-1\s+2\d\fIr\fP, so
|
||
.B slerp(q, r, t)
|
||
is \fIq\fP(\fIq\fP\u\s-2-1\s+2\d\fIr\fP)\u\s-2\fIt\fP\s+2\d.
|
||
.TP
|
||
.B qmid
|
||
.B slerp(q, r, .5)
|
||
.TP
|
||
.B qsqrt
|
||
The square root of
|
||
.IR q .
|
||
This is just a rotation about the same axis by half the angle.
|
||
.PD
|
||
.SH SOURCE
|
||
.B \*9/src/libgeometry/quaternion.c
|
||
.SH SEE ALSO
|
||
.MR matrix 3 ,
|
||
.MR qball 3
|
||
.SH BUGS
|
||
To avoid name conflicts with NetBSD,
|
||
.I qdiv
|
||
is a preprocessor macro defined as
|
||
.IR p9qdiv ;
|
||
see
|
||
.MR intro 3 .
|