## Quaternions

Quaternions are an extension to the number system: real numbers may be thought of as points on a line, complex numbers as points in a plane, and quaternion numbers as points in four-dimensional space.

Apart from mathematical curiosity, quaternions are useful for specifying rotations in three dimensional space (e.g. in this game), and also for image analysis.

An introduction to quaternions and this scheme library is available here.

### Exported Procedures

`(make-rectangular w [x [y z]])`procedureConstructs a number, complex number, or quaternion number depending on if given 1, 2 or 4 arguments.

> (make-rectangular 1) 1 > (make-rectangular 1 2) 1+2i > (make-rectangular 1 2 3 4) 1+2i+3j+4k

`(make-polar mu theta [phi psi])`procedureAn alternative way of defining a quaternion, through the magnitude

`mu`, the angle`theta`, the colatitude`phi`and longitude`psi`.

`(real-part n)`procedureReturns the real part of a number.

> (real-part (make-rectangular 1 2 3 4)) 1

`(imag-part n)`procedureReturns the imaginary part (the

`i`) of a complex or quaternion number.> (imag-part (make-rectangular 1 2 3 4)) 2

`(jmag-part n)`procedureReturns the

`j`part of a quaternion number.> (jmag-part (make-rectangular 1 2 3 4)) 3

`(kmag-part n)`procedureReturns the

`k`part of a quaternion number.> (kmag-part (make-rectangular 1 2 3 4)) 4

`(magnitude n)`procedureThe length of

`n`treated as a vector.

`(angle n)`procedureSee

`make-polar`.

`(number? n)`procedureChecks if given argument is any kind of number.

> (number? 3) #t > (number? 1+2i) #t > (number? (make-rectangular 1 2 3 4)) #t

`(quaternion? n)`procedureThe same as

`number?`.

`(= q1 ...)`procedureTests for equality of given numbers.

`(+ q1 ...)`procedureReturns the sum of given numbers.

> (+ 3 2+3i (make-rectangular 1 2 3 4)) 6+5i+3j+4k

`(- q1 ...)`procedureReturns the difference of given numbers, associating to left.

`(* q1 ...)`procedureReturns the product of given numbers.

> (* 2 (make-rectangular 1 2 3 4)) 2+4i+6j+8k

`(/ q1 ...)`procedureReturns quotient of given numbers, associating to left.

`(exp n)`procedureUsual

`exp`function extended to quaternions.

`(log n)`procedureUsual

`log`function extended to quaternions.

`(expt m n)`procedureUsual

`expt`function extended to quaternions.

`(sqrt n)`procedureUsual

`sqrt`function extended to quaternions.

`(sin n)`procedureUsual

`sin`function extended to quaternions.

`(cos n)`procedureUsual

`cos`function extended to quaternions.

`(tan n)`procedureUsual

`tan`function extended to quaternions.

`(asin n)`procedureUsual

`asin`function extended to quaternions.

`(acos n)`procedureUsual

`acos`function extended to quaternions.

`(atan n)`procedureUsual

`atan`function extended to quaternions.

`(atan y x)`procedureUsual

`atan`function extended to quaternions.

`(vector-part q)`procedureReturns the quaternion with its real part set to 0.

`(colatitude q)`procedureSee

`make-polar`.

`(longitude q)`procedureSee

`make-polar`.

`(conjugate q)`procedureReturns quaternion with same real part and sign of

`i``j`and`k`part of`q`reversed.> (conjugate (make-rectangular 1 2 3 4)) 1-2i-3j-4k

`(unit-vector q)`procedureReturns a quaternion in same direction as

`q`but of unit length; the real part of`q`is set to 0.

`(dot-product q1 q2)`procedureReal parts of

`q1`and`q2`must be 0. The dot product is the negative of the real part of`q1 x q2`.

`(cross-product q1 q2)`procedureReal parts of

`q1`and`q2`must be 0. The cross product is the vector part of`q1 x q2`.

### Author

The original version of this library was created by Dorai Sitaram.

This port to chicken scheme is by Peter Lane.

### License

GPL version 3.0.

### Version History

- version 1.0: released.