! Copyright (C) 2009 Joe Groff. ! See http://factorcode.org/license.txt for BSD license. USING: kernel math math.vectors sequences ; IN: math.vectors.homogeneous : (homogeneous-xyz) ( h -- xyz ) but-last ; inline : (homogeneous-w) ( h -- w ) last ; inline : h+ ( a b -- c ) 2dup [ (homogeneous-w) ] bi@ over = [ [ [ (homogeneous-xyz) ] bi@ v+ ] dip suffix ] [ drop [ [ (homogeneous-xyz) ] [ (homogeneous-w) ] bi* v*n ] [ [ (homogeneous-w) ] [ (homogeneous-xyz) ] bi* n*v v+ ] [ [ (homogeneous-w) ] [ (homogeneous-w) ] bi* * suffix ] 2tri ] if ; : n*h ( n h -- nh ) [ (homogeneous-xyz) n*v ] [ (homogeneous-w) suffix ] bi ; : h*n ( h n -- nh ) swap n*h ; : hneg ( h -- -h ) -1.0 swap n*h ; : h- ( a b -- c ) hneg h+ ; : v>h ( v -- h ) 1.0 suffix ; : h>v ( h -- v ) [ (homogeneous-xyz) ] [ (homogeneous-w) ] bi v/n ;