math.functions sequences ;
IN: math.affine-transforms
-TUPLE: affine-transform x y origin ;
+TUPLE: affine-transform { x read-only } { y read-only } { origin read-only } ;
C: <affine-transform> affine-transform
CONSTANT: identity-transform T{ affine-transform f { 1.0 0.0 } { 0.0 1.0 } { 0.0 0.0 } }
: axes ( a -- a' )
- clone { 0.0 0.0 } >>origin ;
+ [ x>> ] [ y>> ] bi { 0.0 0.0 } <affine-transform> ;
: a.v ( a v -- v )
[ [ x>> ] [ first ] bi* v*n ]
[ 0.0 2array ] [ 0.0 swap 2array ] bi* { 0.0 0.0 } <affine-transform> ;
: center-rotation ( transform center -- transform )
- [ clone dup ] dip [ vneg a.v ] [ v+ ] bi >>origin ;
+ [ [ x>> ] [ y>> ] [ ] tri ] dip [ vneg a.v ] [ v+ ] bi <affine-transform> ;
: flatten-transform ( transform -- array )
[ x>> ] [ y>> ] [ origin>> ] tri 3append ;
(inverted-axes) { 0.0 0.0 } <affine-transform> ;
: inverse-transform ( a -- a^-1 )
- [ inverse-axes dup ] [ origin>> ] bi
- a.v vneg >>origin ;
+ [ inverse-axes [ x>> ] [ y>> ] [ ] tri ] [ origin>> ] bi
+ a.v vneg <affine-transform> ;
: transpose-axes ( a -- a^T )
[ [ x>> first ] [ y>> first ] bi 2array ]
[ origin>> ] tri <affine-transform> ;
: a. ( a a -- a )
- transpose-axes {
- [ [ x>> ] [ x>> ] bi* v. ]
- [ [ x>> ] [ y>> ] bi* v. ]
- [ [ y>> ] [ x>> ] bi* v. ]
- [ [ y>> ] [ y>> ] bi* v. ]
+ {
+ [ [ transpose-axes x>> ] [ x>> ] bi* v. ]
+ [ [ transpose-axes y>> ] [ x>> ] bi* v. ]
+ [ [ transpose-axes x>> ] [ y>> ] bi* v. ]
+ [ [ transpose-axes y>> ] [ y>> ] bi* v. ]
[ origin>> a.v ]
} 2cleave
[ [ 2array ] 2bi@ ] dip <affine-transform> ;
math.functions multiline sequences svg tools.test xml xml.traversal ;
IN: svg.tests
-{ 1.0 2.25 } { -3.0 4.0 } { 5.5 0.000001 } <affine-transform> 1array [
- "matrix ( 1 +2.25 -3 , 0.4e+1 ,5.5, 1e-6 )" svg-transform>affine-transform
+{ 1.0 2.25 } { -3.0 4.0 } { 5.5 0.5 } <affine-transform> 1array [
+ "matrix ( 1 +2.25 -3 , 0.4e+1 ,5.5, 5e-1 )" svg-transform>affine-transform
] unit-test
{ 1.0 0.0 } { 0.0 1.0 } { 5.0 10.0 } <affine-transform> 1array [
"scale(2.0 4.0)" svg-transform>affine-transform
] unit-test
-{ 1.0 0.0 } { $[ 45 degrees tan ] 1.0 } { 0.0 0.0 } <affine-transform> 1array [
+[ t ] [
"skewX(45)" svg-transform>affine-transform
+ { 1.0 0.0 } { 1.0 1.0 } { 0.0 0.0 } <affine-transform> 0.001 a~
] unit-test
-{ 1.0 $[ -45 degrees tan ] } { 0.0 1.0 } { 0.0 0.0 } <affine-transform> 1array [
+[ t ] [
"skewY(-4.5e1)" svg-transform>affine-transform
+ { 1.0 -1.0 } { 0.0 1.0 } { 0.0 0.0 } <affine-transform> 0.001 a~
] unit-test
-{ $[ 30 degrees cos ] $[ 30 degrees sin ] }
-{ $[ -30 degrees sin ] $[ 30 degrees cos ] } { 0.0 0.0 } <affine-transform> 1array [
+[ t ] [
"rotate(30)" svg-transform>affine-transform
+ { $[ 0.75 sqrt ] 0.5 }
+ { -0.5 $[ 0.75 sqrt ] }
+ { 0.0 0.0 } <affine-transform>
+ 0.001 a~
] unit-test
[ t ] [