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

transform zeroTransform;

the zero transform;

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. The function bool isometry(transform t) can be used to test if t is an isometry (preserves distance).