Curves and Transformations
Curves
So far we have been working with straight lines, but MetaPost is also great at drawing smooth curved paths.
If you recall from the chapter on variables a path
is simply a combination of pairs and connections between them.
To connect them with a curved path we use ..
rather than the --
we have been using so far for straight lines, we can mix ..
and --
as we please.
beginfig(3);
z1=-z4=(-1u,1u);
z3=-z2=(1u,1u);
dotlabel.top("z1",z1);
dotlabel.bot("z2",z2);
dotlabel.top("z3",z3);
dotlabel.bot("z4",z4);
draw z1..z2..z4..z3..cycle dashed evenly;
endfig;
Transformations
We just saw one way of drawing a circle in MetaPost, we can also use the build in variable fullcircle
.
Lets draw a two circles next to each other:
draw fullcircle;
draw fullcircle shifted (1cm,0);
shifted
is an example of a transform, it simply adds a pair to every pair in the transformed path.
Other commonly used transforms are rotated
and scaled
and xscaled
,=yscaled=.
rotated
rotates pairs around the origin a given number of degrees counter-clockwise
z1 = (1,1);
z2 = z1 rotated 90;
Scaled simply multiplies the x, y or both coordinate with a given factor
u:=1cm;
draw fullcircle scaled u;
draw fullcircle scaled 1.5u;
Combining transforms
We can construct new transformations by combining existing combinations into a Transform
variable.
To start off use the special identity
transform which does nothing on it's own.
beginfig(4);
u:=1cm;
transform T;
T = identity xscaled -1u yscaled 0.5u rotated 45;
draw fullcircle scaled u;
draw fullcircle transformed T;
draw fullcircle transformed T rotated 90;
endfig;
Exercises
You can specify the direction a path enters and leaves a point at, by putting a direction keyword (left,right,up,down
)
in curly braces before or after the point in the path definition. You can also specify a custom direction using dir x
where x
is a an angle in degrees (moving counter clockwise with dir 0
being straight to the right).
beginfig(1);
z1=(0,1u);
z2=(1u,0);
dotlabel.top("z1",z1);
dotlabel.rt("z2",z2);
draw z1{down}..{dir 45}z2;
endfig;
The directions are given along the travel direction of the path, so a curve entering a point by going down looks the same as one leaving by going up etc.
The transform reflectedabout
(p,q) can be used to mirror paths about the straight line from pair p to pair q.
Using this information along with what we have learned so far, try to draw an image like this:
Hint
outputformat := "png";
outputtemplate := "%j_%c.png";
hppp := 0.25;
vppp := 0.25;
u:=0.5cm;
beginfig(1);
z0=-z1=(0,1u);
z2=-z3=(1u,0);
z4=(0,2u);
z5=(2u,0);
path p,m;
p:= z0{down}..{right}z2{left}..{down}z1{up}..{left}z3{right}..{up}z0;
m:= z4--z5;
draw p;
draw m dashed evenly;
draw p reflectedabout(z4,z5);
endfig;