((section 2 "Outdated egg!" (p "This is an egg for CHICKEN 4, the unsupported old release.  You're almost certainly looking for " (int-link "/eggref/5/quaternions" "the CHICKEN 5 version of this egg") ", if it exists.") (p "If it does not exist, there may be equivalent functionality provided by another egg; have a look at the " (link "https://wiki.call-cc.org/chicken-projects/egg-index-5.html" "egg index") ". Otherwise, please consider porting this egg to the current version of CHICKEN.")) (section 2 "Quaternions" (p "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.") (p "Apart from mathematical curiosity, quaternions are useful for specifying rotations in three dimensional space (e.g. " (link "http://wiki.alioth.net/index.php/Quaternion" " in this game") "), and also for image analysis.") (p "An introduction to quaternions and this scheme library is available " (link "http://www.ccs.neu.edu/home/dorai/squat/squat.html" "here") ".") (section 3 "Exported Procedures" (def (sig (procedure "(make-rectangular w [x [y z]])" (id make-rectangular))) (p "Constructs a number, complex number, or quaternion number depending on if given 1, 2 or 4 arguments.") (pre "> (make-rectangular 1)\n1\n> (make-rectangular 1 2)\n1+2i\n> (make-rectangular 1 2 3 4)\n1+2i+3j+4k")) (def (sig (procedure "(make-polar mu theta [phi psi])" (id make-polar))) (p "An alternative way of defining a quaternion, through the magnitude " (tt "mu") ", the angle " (tt "theta") ", the colatitude " (tt "phi") " and longitude " (tt "psi") ".")) (def (sig (procedure "(real-part n)" (id real-part))) (p "Returns the real part of a number.") (pre "> (real-part (make-rectangular 1 2 3 4))\n1")) (def (sig (procedure "(imag-part n)" (id imag-part))) (p "Returns the imaginary part (the " (tt "i") ") of a complex or quaternion number.") (pre "> (imag-part (make-rectangular 1 2 3 4))\n2")) (def (sig (procedure "(jmag-part n)" (id jmag-part))) (p "Returns the " (tt "j") " part of a quaternion number.") (pre "> (jmag-part (make-rectangular 1 2 3 4))\n3")) (def (sig (procedure "(kmag-part n)" (id kmag-part))) (p "Returns the " (tt "k") " part of a quaternion number.") (pre "> (kmag-part (make-rectangular 1 2 3 4))\n4")) (def (sig (procedure "(magnitude n)" (id magnitude))) (p "The length of " (tt "n") " treated as a vector.")) (def (sig (procedure "(angle n)" (id angle))) (p "See " (tt "make-polar") ".")) (def (sig (procedure "(number? n)" (id number?))) (p "Checks if given argument is any kind of number.") (pre "> (number? 3)\n#t\n> (number? 1+2i)\n#t\n> (number? (make-rectangular 1 2 3 4))\n#t")) (def (sig (procedure "(quaternion? n)" (id quaternion?))) (p "The same as " (tt "number?") ".")) (def (sig (procedure "(= q1 ...)" (id =))) (p "Tests for equality of given numbers.")) (def (sig (procedure "(+ q1 ...)" (id +))) (p "Returns the sum of given numbers.") (pre "> (+ 3 2+3i (make-rectangular 1 2 3 4))\n6+5i+3j+4k")) (def (sig (procedure "(- q1 ...)" (id -))) (p "Returns the difference of given numbers, associating to left.")) (def (sig (procedure "(* q1 ...)" (id *))) (p "Returns the product of given numbers.") (pre "> (* 2 (make-rectangular 1 2 3 4))\n2+4i+6j+8k")) (def (sig (procedure "(/ q1 ...)" (id /))) (p "Returns quotient of given numbers, associating to left.")) (def (sig (procedure "(exp n)" (id exp))) (p "Usual " (tt "exp") " function extended to quaternions.")) (def (sig (procedure "(log n)" (id log))) (p "Usual " (tt "log") " function extended to quaternions.")) (def (sig (procedure "(expt m n)" (id expt))) (p "Usual " (tt "expt") " function extended to quaternions.")) (def (sig (procedure "(sqrt n)" (id sqrt))) (p "Usual " (tt "sqrt") " function extended to quaternions.")) (def (sig (procedure "(sin n)" (id sin))) (p "Usual " (tt "sin") " function extended to quaternions.")) (def (sig (procedure "(cos n)" (id cos))) (p "Usual " (tt "cos") " function extended to quaternions.")) (def (sig (procedure "(tan n)" (id tan))) (p "Usual " (tt "tan") " function extended to quaternions.")) (def (sig (procedure "(asin n)" (id asin))) (p "Usual " (tt "asin") " function extended to quaternions.")) (def (sig (procedure "(acos n)" (id acos))) (p "Usual " (tt "acos") " function extended to quaternions.")) (def (sig (procedure "(atan n)" (id atan))) (p "Usual " (tt "atan") " function extended to quaternions.")) (def (sig (procedure "(atan y x)" (id atan))) (p "Usual " (tt "atan") " function extended to quaternions.")) (def (sig (procedure "(vector-part q)" (id vector-part))) (p "Returns the quaternion with its real part set to 0.")) (def (sig (procedure "(colatitude q)" (id colatitude))) (p "See " (tt "make-polar") ".")) (def (sig (procedure "(longitude q)" (id longitude))) (p "See " (tt "make-polar") ".")) (def (sig (procedure "(conjugate q)" (id conjugate))) (p "Returns quaternion with same real part and sign of " (tt "i") " " (tt "j") " and " (tt "k") " part of " (tt "q") " reversed.") (pre "> (conjugate (make-rectangular 1 2 3 4))\n1-2i-3j-4k")) (def (sig (procedure "(unit-vector q)" (id unit-vector))) (p "Returns a quaternion in same direction as " (tt "q") " but of unit length; the real part of " (tt "q") " is set to 0.")) (def (sig (procedure "(dot-product q1 q2)" (id dot-product))) (p "Real parts of " (tt "q1") " and " (tt "q2") " must be 0.  The dot product is the negative of the real part of " (tt "q1 x q2") ".")) (def (sig (procedure "(cross-product q1 q2)" (id cross-product))) (p "Real parts of " (tt "q1") " and " (tt "q2") " must be 0.  The cross product is the vector part of " (tt "q1 x q2") "."))) (section 3 "Author" (p "The original version of this library was created by Dorai Sitaram.") (p "This port to chicken scheme is by " (int-link "/users/peter-lane" "Peter Lane") ".")) (section 3 "License" (p "GPL version 3.0.")) (section 3 "Version History" (ul (li "version 1.0: released.")))))