asymptote: Transforms
6.4 Transforms
==============
'Asymptote' makes extensive use of affine transforms. A pair '(x,y)' is
transformed by the transform 't=(t.x,t.y,t.xx,t.xy,t.yx,t.yy)' to
'(x',y')', where
x' = t.x + t.xx * x + t.xy * y
y' = t.y + t.yx * x + t.yy * y
This is equivalent to the 'PostScript' transformation '[t.xx t.yx t.xy
t.yy t.x t.y]'.
Transforms can be applied to pairs, guides, paths, pens, strings,
transforms, frames, and pictures by multiplication (via the binary
operator '*') on the left (circle for an example). Transforms
can be composed with one another and inverted with the function
'transform inverse(transform t)'; they can also be raised to any integer
power with the '^' operator.
The built-in transforms are:
'transform identity();'
the identity transform;
'transform shift(pair z);'
translates by the pair 'z';
'transform shift(real x, real y);'
translates by the pair '(x,y)';
'transform xscale(real x);'
scales by 'x' in the x direction;
'transform yscale(real y);'
scales by 'y' in the y direction;
'transform scale(real s);'
scale by 's' in both x and y directions;
'transform scale(real x, real y);'
scale by 'x' in the x direction and by 'y' in the y direction;
'transform slant(real s);'
maps '(x,y)' -> '(x+s*y,y)';
'transform rotate(real angle, pair z=(0,0));'
rotates by 'angle' in degrees about 'z';
'transform reflect(pair a, pair b);'
reflects about the line 'a--b'.
The implicit initializer for transforms is 'identity()'. The
routines 'shift(transform t)' and 'shiftless(transform t)' return the
transforms '(t.x,t.y,0,0,0,0)' and '(0,0,t.xx,t.xy,t.yx,t.yy)'
respectively.