%!
%%BoundingBox: 124.38 124.38 487.61 487.61
% Cookbook Example Program from First Printing, Revised 7 Jan 1985
% Program: Repeated Shapes     Number: 6
%-----------------------------------------------------------------------------
%
                                           % This program prints a rosette
                                           % design by defining a section of
                                           % that design and printing that
                                           % section repeatedly. This program
                                           % illustrates the ``for'' and
                                           % "arc" operators, and it shows
                                           % how coordinate transformations
                                           % can be nested so as to use the
                                           % most convenient coordinate
                                           % system for each part of a
                                           % design.
/inch {72 mul} def

/wedge                                      % Define an ``ice cream cone''
 { newpath                                 % shape by means of the ``arc''
     0 0 moveto                            % operator. This shape will have a
     1 0 translate                         % 30 degree angle topped off with
     15 rotate                             % a semicircle. Set the path's
     0 15 sin translate                    % first point at the current
     0 0 15 sin -90 90 arc                 % origin. Next, move the origin to
   closepath                               % the center of the semicircle by
 } def                                     % translating to the right 1 unit,
                                           % rotating counter-clockwise by 15
                                           % degrees, and translating ``up''
                                           % in the rotated system by the
                                           % radius of the semicircle. The
                                           % ``arc'' operator includes a
                                           % straight line to the initial
                                           % point of the arc and a curved
                                           % section to the end of the arc.
                                           % Note that the semicircle goes
                                           % from -90 degrees to 90 degrees
                                           % in the rotated coordinate
                                           % system.

gsave
 4.25 inch 4.25 inch translate             % Move into position for the
                                           % rosette.
 1.75 inch 1.75 inch scale                 % Make the edges of the rosette 1
                                           % 3/4 inches long.
 0.02 setlinewidth                         % Use a 7/200 inch thick line.
 2 1 13                                    % Set up the ``for'' operator to
                                           % iterate 12 times, pushing 2 onto
                                           % the stack the first time, 3 the
                                           % next time, ... , and 13 the last
                                           % time.
  {                                        % The last argument for ``for'' is
                                           % the sequence of operations to be
                                           % repeated. This sequence must be
                                           % enclosed by braces.
    13 div setgray                         % Divide the loop index by 13 to
                                           % set a gray value.
    gsave                                  % Enclose the ``wedge'' operation
      wedge                                % in a ``gsave''-``grestore''
                                           % pair, as it will mess up the
                                           % coordinate system.
      gsave                                % Save the wedge path for use
                                           % after the ``fill''.
        fill
      grestore
      0 setgray stroke                     % Draw a black border around the
                                           % wedge.
    grestore                               % Get out of the coordinate system
                                           % left by wedge.
    30 rotate                              % Set up for the next section.
  } for                                    % Close the last argument and
                                           % execute the ``for'' operator.
grestore
showpage