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 (Seecircle 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.