summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/psfig/figs/piechart.ps
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/generic/psfig/figs/piechart.ps')
-rw-r--r--Master/texmf-dist/doc/generic/psfig/figs/piechart.ps154
1 files changed, 154 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/psfig/figs/piechart.ps b/Master/texmf-dist/doc/generic/psfig/figs/piechart.ps
new file mode 100644
index 00000000000..164583e8d87
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/psfig/figs/piechart.ps
@@ -0,0 +1,154 @@
+%!
+%%BoundingBox: 126 246 486 546
+% Cookbook Example Program from First Printing, Revised 7 Jan 1985
+% Program: Drawing a Pie Chart Number: 18
+%-----------------------------------------------------------------------------
+%
+/PieDict 24 dict def % Local storage for
+ % ``DrawPieChart'' and its related
+ % procedures.
+PieDict begin
+ /DrawSlice % DrawSlice draws an outlined and
+ { /grayshade exch def % filled-in pie slice. It takes
+ /endangle exch def % four operands: the label for
+ /startangle exch def % this particular pie slice, the
+ /thelabel exch def % starting angle for the slice,
+ % the ending angle for the slice
+ % and the shade of gray the slice
+ % should be.
+
+ newpath % Create a path which will draw a
+ % pie slice.
+ 0 0 moveto
+ 0 0 radius startangle endangle arc
+ closepath
+
+ 1.415 setmiterlimit % This guarantees that when we
+ % outline the pie slices with a
+ % stroke that we will not get a
+ % spike on the interior angles.
+ gsave grayshade setgray fill grestore % Fill the pie slice path with the
+ stroke % appropriate gray color. By using
+ % gsave and grestore we don't lose
+ % the current path. Since
+ % PostScript paints color onto the
+ % page, it is very important that
+ % we fill the pie slice first and
+ % then outline it with a stroke.
+ gsave % Draw the tick mark and place the
+ % label:
+ startangle endangle add 2 div % Find the center of the pie slice
+ rotate % and rotate so that the x-axis
+ % coincides with this center.
+ radius 0 translate % Translate the origin out to the
+ % circumference.
+ newpath
+ 0 0 moveto labelps .8 mul 0 lineto% Draw the tick-mark.
+ stroke
+ labelps 0 translate % Move the origin out a little
+ % beyond the circumference.
+ 0 0 transform % Next we wish to place the label
+ grestore % at the current origin. If we
+ itransform % simply draw the text on the page
+ /y exch def /x exch def % now, it would come out rotated.
+ x y moveto % Since this is not desired we
+ % avoid it by returning to the
+ % previous unrotated coordinate
+ % system. Before returning,
+ % though, we would like to
+ x 0 lt % remember the position of the
+ { thelabel stringwidth pop neg % current origin on the printed
+ 0 rmoveto % page. We will accomplish this by
+ } if % using the transform and
+ % itransform operators. Performing
+ % a transform on the origin pushes
+ % the coordinates of the origin in
+ % device space onto the operand
+ % stack. Performing a grestore
+ % returns us to the previous
+ % unrotated coordinate system.
+ % Next we perform an itransform on
+ % the two device coordinates left
+ % on the stack to determine where
+ % we are in the current coordinate
+ % system.
+ y 0 lt { 0 labelps neg rmoveto } if % Make some adjustments so that
+ thelabel show % the label text won't collide
+ } def % with the pie slice.
+ /findgray % Procedure findgray calculates
+ { /i exch def /n exch def % the gray value for a slice. It
+ i 2 mod 0 eq % takes two arguments: the total
+ { i 2 div n 2 div round add n div } % number of slices and the current
+ { i 1 add 2 div n div } % slice number (Given that there
+ ifelse % are n pie slices, the slices are
+ } def % ``numbered'' from 1 to n). The
+end % gray values for the pie slices
+ % range evenly from white to black
+ % (i.e. - the values provided to
+ % setgray range from (n/n, n-1/n,
+ % ..., 1/n)). Since we don't want
+ % similar values of gray next to
+ % each other, findgray
+ % ``shuffles'' the possible
+ % combinations of gray.
+
+/DrawPieChart % DrawPieChart takes seven
+ { PieDict begin % arguments: the title of the pie
+ /radius exch def % chart, the point size to print
+ /ycenter exch def /xcenter exch def % the title in, the point size to
+ /PieArray exch def % print the labels for each slice
+ /labelps exch def /titleps exch def % in, a special array (described
+ /title exch def % below where DrawPieChart is
+ % called), the (x,y) center of the
+ % pie chart and the radius of the
+ % pie chart.
+
+ gsave
+ xcenter ycenter translate % Translate the coordinate system
+ % origin to center of pie chart.
+ /Helvetica findfont titleps % Print the title of the pie chart
+ scalefont setfont % in Helvetica.
+ title stringwidth pop 2 div neg % Center the title below the pie
+ % chart.
+ radius neg titleps 3 mul sub
+ moveto title show
+ /Helvetica findfont labelps % Print the individual pie slice
+ scalefont setfont % labels in Helvetica
+ /numslices PieArray length def
+ /slicecnt 0 def
+ /curangle 0 def % A ``loop'' variable that keeps
+ % track of the angle of arc to
+ % begin each pie slice at.
+ PieArray % Repeat the following for each
+ % element in the PieArray.
+ { /slicearray exch def
+ slicearray aload pop % Push the label and percentage
+ % onto the stack.
+ /percent exch def
+ /label exch def
+ /perangle percent 360 mul def % Convert the percentage into
+ % degrees of angle.
+ /slicecnt slicecnt 1 add def
+ label curangle
+ curangle perangle add
+ numslices slicecnt findgray
+ DrawSlice
+ /curangle curangle perangle add % Update the current starting
+ % angle.
+ def
+ } forall
+ grestore
+ end
+ } def
+
+() 18 9
+ [ [(Blueberry) .12 ] % The pie array is an array of
+ [(Cherry) .30 ] % arrays. Each array in the pie
+ [(Apple) .26 ] % array contains a string denoting
+ [(Boston Cream) .16 ] % the label to be printed next to
+ [(Other) .04 ] % the pie slice followed by a real
+ [(Vanilla Cream) .12 ] % number indicating the percentage
+ ] 306 396 100 DrawPieChart % of the pie represented by this
+ % particular slice.
+showpage
+