From 7548e57b5bbccf1d4c5a74ac6b21ff34cf6be347 Mon Sep 17 00:00:00 2001 From: Erik Charlebois Date: Thu, 25 Feb 2010 08:15:53 -0800 Subject: [PATCH] Add perp and angle-between words for vectors. Fix bug in cross product and add unit tests. --- basis/math/matrices/matrices-tests.factor | 3 ++- basis/math/matrices/matrices.factor | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/basis/math/matrices/matrices-tests.factor b/basis/math/matrices/matrices-tests.factor index a22f6cc978..b827741209 100644 --- a/basis/math/matrices/matrices-tests.factor +++ b/basis/math/matrices/matrices-tests.factor @@ -99,9 +99,10 @@ USING: math.matrices math.vectors tools.test math ; m. ] unit-test -[ { 0 0 -1 } ] [ { 1 0 0 } { 0 1 0 } cross ] unit-test +[ { 0 0 1 } ] [ { 1 0 0 } { 0 1 0 } cross ] unit-test [ { 1 0 0 } ] [ { 0 1 0 } { 0 0 1 } cross ] unit-test [ { 0 1 0 } ] [ { 0 0 1 } { 1 0 0 } cross ] unit-test +[ { 0.0 -0.707 0.707 } ] [ { 1.0 0.0 0.0 } { 0.0 0.707 0.707 } cross ] unit-test [ { 1 0 0 } ] [ { 1 1 0 } { 1 0 0 } proj ] unit-test diff --git a/basis/math/matrices/matrices.factor b/basis/math/matrices/matrices.factor index 2a1a217c2e..216d2c31bb 100644 --- a/basis/math/matrices/matrices.factor +++ b/basis/math/matrices/matrices.factor @@ -111,12 +111,18 @@ IN: math.matrices : mnorm ( m -- n ) dup mmax abs m/n ; : cross ( vec1 vec2 -- vec3 ) - [ [ { 1 2 1 } vshuffle ] [ { 2 0 0 } vshuffle ] bi* v* ] - [ [ { 2 0 0 } vshuffle ] [ { 1 2 1 } vshuffle ] bi* v* ] 2bi v- ; inline + [ [ { 1 2 0 } vshuffle ] [ { 2 0 1 } vshuffle ] bi* v* ] + [ [ { 2 0 1 } vshuffle ] [ { 1 2 0 } vshuffle ] bi* v* ] 2bi v- ; inline : proj ( v u -- w ) [ [ v. ] [ norm-sq ] bi / ] keep n*v ; +: perp ( v u -- w ) + dupd proj v- ; + +: angle-between ( v u -- a ) + [ normalize ] bi@ v. acos ; + : (gram-schmidt) ( v seq -- newseq ) [ dupd proj v- ] each ;