| 
									
										
										
										
											2010-02-18 18:31:52 -05:00
										 |  |  | ! Copyright (C) 2005, 2010 Joe Groff, Slava Pestov. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2010-02-04 23:08:37 -05:00
										 |  |  | USING: arrays combinators kernel locals math math.functions | 
					
						
							|  |  |  | math.libm math.order math.vectors sequences ;
 | 
					
						
							| 
									
										
										
										
											2008-11-17 21:12:10 -05:00
										 |  |  | IN: math.quaternions | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-27 11:23:59 -04:00
										 |  |  | : q+ ( u v -- u+v )
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  |     v+ ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-27 11:23:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : q- ( u v -- u-v )
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  |     v- ; inline
 | 
					
						
							| 
									
										
										
										
											2009-04-27 11:23:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-04 14:25:45 -05:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: (q*sign) ( q -- q' )
 | 
					
						
							|  |  |  | M: object (q*sign) { -1 1 1 1 } v* ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : q* ( u v -- u*v )
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         [ [ { 1 0 0 0 } vshuffle ] [ { 1 1 2 3 } vshuffle ] bi* v*    ] | 
					
						
							|  |  |  |         [ [ { 2 1 2 3 } vshuffle ] [ { 2 0 0 0 } vshuffle ] bi* v* v+ ] | 
					
						
							|  |  |  |         [ [ { 3 2 3 1 } vshuffle ] [ { 3 3 1 2 } vshuffle ] bi* v* v+ ] | 
					
						
							|  |  |  |         [ [ { 0 3 1 2 } vshuffle ] [ { 0 2 3 1 } vshuffle ] bi* v* v- ] | 
					
						
							| 
									
										
										
										
											2010-02-04 14:25:45 -05:00
										 |  |  |     } 2cleave (q*sign) ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-04 14:25:45 -05:00
										 |  |  | GENERIC: qconjugate ( u -- u' )
 | 
					
						
							|  |  |  | M: object qconjugate ( u -- u' )
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  |     { 1 -1 -1 -1 } v* ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : qrecip ( u -- 1/u )
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  |     qconjugate dup norm-sq v/n ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : q/ ( u v -- u/v )
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  |     qrecip q* ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-17 22:23:33 -04:00
										 |  |  | : n*q ( n q -- r )
 | 
					
						
							|  |  |  |     n*v ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 18:31:52 -05:00
										 |  |  | : q*n ( q n -- r )
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  |     v*n ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  | : n>q ( n -- q )
 | 
					
						
							|  |  |  |     0 0 0 4array ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  | : n>q-like ( c exemplar -- q )
 | 
					
						
							|  |  |  |     [ 0 0 0 ] dip 4sequence ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  | : c>q ( c -- q )
 | 
					
						
							|  |  |  |     >rect 0 0 4array ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  | : c>q-like ( c exemplar -- q )
 | 
					
						
							|  |  |  |     [ >rect 0 0 ] dip 4sequence ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-17 21:12:10 -05:00
										 |  |  | ! Euler angles | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  | : (euler) ( theta exemplar shuffle -- q )
 | 
					
						
							|  |  |  |     swap
 | 
					
						
							|  |  |  |     [ 0.5 * [ fcos ] [ fsin ] bi 0.0 0.0 ] [ call ] [ 4sequence ] tri* ; inline
 | 
					
						
							| 
									
										
										
										
											2008-11-17 21:12:10 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  | : euler-like ( phi theta psi exemplar -- q )
 | 
					
						
							|  |  |  |     [ [ ] (euler) ] [ [ swapd ] (euler) ] [ [ rot ] (euler) ] tri-curry tri* q* q* ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : euler ( phi theta psi -- q )
 | 
					
						
							| 
									
										
										
										
											2010-02-02 03:30:21 -05:00
										 |  |  |     { } euler-like ; inline
 | 
					
						
							| 
									
										
										
										
											2010-02-04 23:08:37 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | :: slerp ( q0 q1 t -- qt )
 | 
					
						
							|  |  |  |     q0 q1 v. -1.0 1.0 clamp :> dot | 
					
						
							|  |  |  |     dot facos t * :> omega | 
					
						
							|  |  |  |     q1 dot q0 n*v v- normalize :> qt' | 
					
						
							|  |  |  |     omega fcos q0 n*v omega fsin qt' n*v v+ ; inline
 |