tquaternion.3 - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tquaternion.3 (3545B)
       ---
            1 .TH QUATERNION 3
            2 .SH NAME
            3 qtom, mtoq, qadd, qsub, qneg, qmul, qdiv, qunit, qinv, qlen, slerp, qmid, qsqrt \- Quaternion arithmetic
            4 .SH SYNOPSIS
            5 .PP
            6 .B
            7 #include <draw.h>
            8 .PP
            9 .B
           10 #include <geometry.h>
           11 .PP
           12 .B
           13 Quaternion qadd(Quaternion q, Quaternion r)
           14 .PP
           15 .B
           16 Quaternion qsub(Quaternion q, Quaternion r)
           17 .PP
           18 .B
           19 Quaternion qneg(Quaternion q)
           20 .PP
           21 .B
           22 Quaternion qmul(Quaternion q, Quaternion r)
           23 .PP
           24 .B
           25 Quaternion qdiv(Quaternion q, Quaternion r)
           26 .PP
           27 .B
           28 Quaternion qinv(Quaternion q)
           29 .PP
           30 .B
           31 double qlen(Quaternion p)
           32 .PP
           33 .B
           34 Quaternion qunit(Quaternion q)
           35 .PP
           36 .B
           37 void qtom(Matrix m, Quaternion q)
           38 .PP
           39 .B
           40 Quaternion mtoq(Matrix mat)
           41 .PP
           42 .B
           43 Quaternion slerp(Quaternion q, Quaternion r, double a)
           44 .PP
           45 .B
           46 Quaternion qmid(Quaternion q, Quaternion r)
           47 .PP
           48 .B
           49 Quaternion qsqrt(Quaternion q)
           50 .SH DESCRIPTION
           51 The Quaternions are a non-commutative extension field of the Real numbers, designed
           52 to do for rotations in 3-space what the complex numbers do for rotations in 2-space.
           53 Quaternions have a real component
           54 .I r
           55 and an imaginary vector component \fIv\fP=(\fIi\fP,\fIj\fP,\fIk\fP).
           56 Quaternions add componentwise and multiply according to the rule
           57 (\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),
           58 where \v'-.3m'.\v'.3m' and × are the ordinary vector dot and cross products.
           59 The multiplicative inverse of a non-zero quaternion (\fIr\fP,\fIv\fP)
           60 is (\fIr\fP,\fI-v\fP)/(\fIr\^\fP\u\s-22\s+2\d-\fIv\fP\v'-.3m'.\v'.3m'\fIv\fP).
           61 .PP
           62 The following routines do arithmetic on quaternions, represented as
           63 .IP
           64 .EX
           65 .ta 6n
           66 typedef struct Quaternion Quaternion;
           67 struct Quaternion{
           68         double r, i, j, k;
           69 };
           70 .EE
           71 .TF qunit
           72 .TP
           73 Name
           74 Description
           75 .TP
           76 .B qadd
           77 Add two quaternions.
           78 .TP
           79 .B qsub
           80 Subtract two quaternions.
           81 .TP
           82 .B qneg
           83 Negate a quaternion.
           84 .TP
           85 .B qmul
           86 Multiply two quaternions.
           87 .TP
           88 .B qdiv
           89 Divide two quaternions.
           90 .TP
           91 .B qinv
           92 Return the multiplicative inverse of a quaternion.
           93 .TP
           94 .B qlen
           95 Return
           96 .BR sqrt(q.r*q.r+q.i*q.i+q.j*q.j+q.k*q.k) ,
           97 the length of a quaternion.
           98 .TP
           99 .B qunit
          100 Return a unit quaternion 
          101 .RI ( length=1 )
          102 with components proportional to
          103 .IR q 's.
          104 .PD
          105 .PP
          106 A rotation by angle \fIθ\fP about axis
          107 .I A
          108 (where
          109 .I A
          110 is a unit vector) can be represented by
          111 the unit quaternion \fIq\fP=(cos \fIθ\fP/2, \fIA\fPsin \fIθ\fP/2).
          112 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.
          113 The quaternion \fIq\fP transforms points by
          114 (0,\fIx',y',z'\fP) = \%\fIq\fP\u\s-2-1\s+2\d(0,\fIx,y,z\fP)\fIq\fP.
          115 Quaternion multiplication composes rotations.
          116 The orientation of an object in 3-space can be represented by a quaternion
          117 giving its rotation relative to some `standard' orientation.
          118 .PP
          119 The following routines operate on rotations or orientations represented as unit quaternions:
          120 .TF slerp
          121 .TP
          122 .B mtoq
          123 Convert a rotation matrix (see
          124 .MR matrix (3) )
          125 to a unit quaternion.
          126 .TP
          127 .B qtom
          128 Convert a unit quaternion to a rotation matrix.
          129 .TP
          130 .B slerp
          131 Spherical lerp.  Interpolate between two orientations.
          132 The rotation that carries
          133 .I q
          134 to
          135 .I r
          136 is \%\fIq\fP\u\s-2-1\s+2\d\fIr\fP, so
          137 .B slerp(q, r, t)
          138 is \fIq\fP(\fIq\fP\u\s-2-1\s+2\d\fIr\fP)\u\s-2\fIt\fP\s+2\d.
          139 .TP
          140 .B qmid
          141 .B slerp(q, r, .5)
          142 .TP
          143 .B qsqrt
          144 The square root of
          145 .IR q .
          146 This is just a rotation about the same axis by half the angle.
          147 .PD
          148 .SH SOURCE
          149 .B \*9/src/libgeometry/quaternion.c
          150 .SH SEE ALSO
          151 .MR matrix (3) ,
          152 .MR qball (3)
          153 .SH BUGS
          154 To avoid name conflicts with NetBSD,
          155 .I qdiv
          156 is a preprocessor macro defined as 
          157 .IR p9qdiv ;
          158 see
          159 .MR intro (3) .