(define (q+ a B)(apply (lambda (a b c d) (apply (lambda (e f g h) (list (+ a e) (+ b f) (+ c g) (+ d h))) B)) a)) (define (q* a B)(apply (lambda (a b c d) (apply (lambda (e f g h) (list (- (* a e) (+ (* b f) (* c g) (* d h))) (+ (* a f) (* b e) (* c h) (- (* d g))) (+ (* a g) (* c e) (* d f) (- (* b h))) (+ (* a h) (* d e) (* b g) (- (* c f))))) B)) a)) (define (qc a) (cons (car a) (map - (cdr a)))) (define (q/ a) (let ((i (/ (car (q* a (qc a)))))) (map (lambda (q) (* q i)) (qc a)))) (define (rot vec rho) (cdr (q* (q* rho (cons 0 vec)) (q/ rho)))) ; (rot '(3 6 7) '(1 0 0 0)) => (3 6 7) ; (rot '(3 4 5) '(0 1 0 0)) => (3 -4 -5) ; (rot '(3 4 5) '(0 0 1 0)) => (-3 4 -5) ; (rot '(3 4 5) '(0 0 0 1)) => (-3 -4 5) ; (rot '(3 5 8) '(1 1 0 0)) => (3 -8 5) ; (rot '(3 4 5) '(1 1 1 1)) => (5 3 4) ; (rot '(3 4 5) '(1 -1 -1 -1)) => (4 5 3) ; (rot '(3 4 5) '(1 2 0 0)) => (3 -32/5 1/5) ; Note that orientation and vector magnitude are always preserved. ; qc is an anti automorphism (define (qa a) (apply (lambda (A B C D) (list A (- B) (- C) D)) a)) ; qa is an automorphism