1 ! (c)2009 Joe Groff, see BSD license
2 USING: accessors arrays combinators combinators.short-circuit kernel
3 math math.functions math.vectors sequences ;
4 IN: math.affine-transforms
6 TUPLE: affine-transform
10 C: <affine-transform> affine-transform
12 CONSTANT: identity-transform T{ affine-transform f
13 { 1.0 0.0 } { 0.0 1.0 } { 0.0 0.0 } }
16 [ x>> ] [ y>> ] bi { 0.0 0.0 } <affine-transform> ;
19 [ [ x>> ] [ first ] bi* v*n ]
20 [ [ y>> ] [ second ] bi* v*n ]
21 [ drop origin>> ] 2tri
25 { 1.0 0.0 } { 0.0 1.0 } { 0.0 0.0 } <affine-transform> ;
26 : <translation> ( origin -- a )
27 [ { 1.0 0.0 } { 0.0 1.0 } ] dip <affine-transform> ;
28 : <rotation> ( theta -- transform )
30 [ 2array ] [ neg swap 2array ] 2bi { 0.0 0.0 } <affine-transform> ;
31 : <scale> ( x y -- transform )
32 [ 0.0 2array ] [ 0.0 swap 2array ] bi* { 0.0 0.0 } <affine-transform> ;
34 : center-rotation ( transform center -- transform )
35 [ [ x>> ] [ y>> ] [ ] tri ] dip [ vneg a.v ] [ v+ ] bi
38 : flatten-transform ( transform -- array )
39 [ x>> ] [ y>> ] [ origin>> ] tri 3append ;
42 [ [ x>> first ] [ y>> second ] bi * ]
43 [ [ x>> second ] [ y>> first ] bi * ] bi - ;
45 : (inverted-axes) ( a -- x y )
46 [ [ y>> second ] [ x>> second neg ] bi 2array ]
47 [ [ y>> first neg ] [ x>> first ] bi 2array ]
51 : inverse-axes ( a -- a^-1 )
52 (inverted-axes) { 0.0 0.0 } <affine-transform> ;
54 : inverse-transform ( a -- a^-1 )
55 [ inverse-axes [ x>> ] [ y>> ] [ ] tri ] [ origin>> ] bi
56 a.v vneg <affine-transform> ;
58 : transpose-axes ( a -- a^T )
59 [ [ x>> first ] [ y>> first ] bi 2array ]
60 [ [ x>> second ] [ y>> second ] bi 2array ]
61 [ origin>> ] tri <affine-transform> ;
65 [ [ transpose-axes x>> ] [ x>> ] bi* vdot ]
66 [ [ transpose-axes y>> ] [ x>> ] bi* vdot ]
67 [ [ transpose-axes x>> ] [ y>> ] bi* vdot ]
68 [ [ transpose-axes y>> ] [ y>> ] bi* vdot ]
71 [ [ 2array ] 2bi@ ] dip <affine-transform> ;
73 : a~ ( a b epsilon -- ? )
75 [ [ [ x>> ] bi@ ] dip v~ ]
76 [ [ [ y>> ] bi@ ] dip v~ ]
77 [ [ [ origin>> ] bi@ ] dip v~ ]