Eric Weeks - personal pages - graphics techniques

# Simple PostScript - Part II

circles, filling shapes

weeks@physics.emory.edu

### Circles and Arcs

To draw a circle or an arc, use the "arc" command. You must specify the center, radius, and starting and ending angles (in degrees). Also, if you are drawing a circle, you should end with "closepath" in order to join the two ends of the arc. This becomes more important when you're filling the circles but it's a good habit to get into.

So, a typical circle command looks like:

4 5 3 0 360 arc closepath stroke

which puts a circle at the coordinates (4,5) with a radius of 3. As usual, nothing is actually drawn until you say "stroke".

As with drawing straight lines, the command "setgray" changes the color of the line drawn and the command "setlinewidth" will affect the width of the line. The actual code that generated the above picture was:

0 setgray 0.1 setlinewidth 4 5 3 0 360 arc closepath stroke

To make arcs, just change the starting and ending angles:

4 5 3 0 360 arc closepath stroke 5 4 2 0 120 arc closepath stroke

There is also a command "arcn" which draws arcs in the opposite direction; for example, the above arc commands could have been written:

4 5 3 360 0 arcn closepath stroke 5 4 2 120 0 arcn closepath stroke

This is only useful when you want to fill the circles.

### Filling shapes

If you have a shape (circle, arbitrary polygon) which you have drawn and closed with "closepath" you can fill the shape. Thus:

4 5 3 0 360 arc closepath 0.7 setgray fill

One side affect of the fill command is that it forgets the current path, as if you had used the "newpath" command. This is the same behavior as "stroke". If you want to fill a shape and also show it's outline, you need to save the current path before you fill it, and then restore the path to draw it (show the outline). You do this with the commands "gsave" and "grestore". They essentially save the entire current PostScript state, and then restore it. Your code will then look like:

0 setgray 0.1 setlinewidth 4 5 3 0 360 arc closepath gsave 0.7 setgray fill grestore stroke

Note that the final stroke command will be black; the color is temporarily changed to light gray, but then "grestore" restores the old color.

Suppose you want to fill a shape with a hole in it (like a donut). You have to be careful about the direction you draw the lines in. The outside line would be drawn in a counter-clockwise direction, and the inside line is drawn in a clockwise direction. Generally I don't remember this rule; I just try it both ways until it works. (In order to draw circles in the clockwise direction, use the "arcn" command discussed above).

4 5 3 0 360 arc closepath 4 5 2 360 0 arcn closepath 0.7 setgray fill

### Using everything

%!PS-Adobe-1.0 matrix currentmatrix /originmat exch def /umatrix {originmat matrix concatmatrix setmatrix} def [28.3465 0 0 28.3465 10.5 100.0] umatrix 0 setgray 0.2 setlinewidth % head 4 5 3 0 360 arc closepath stroke % mouth 4 5 2 210 330 arc closepath gsave % this is red: 1 0 0 setrgbcolor fill grestore stroke % eyes 3 6 0.8 0 360 arc closepath gsave % this is blue: 0 0 1 setrgbcolor fill grestore stroke 5 6 0.8 0 360 arc closepath gsave % this is blue: 0 0 1 setrgbcolor fill grestore stroke showpage