[comp.lang.postscript] Summer Gardening

booter@deimos.ads.com (Elaine Richards) (06/29/88)

%
% This is the virtual garden and you are the gardener.
%
% The original flower program was written by Brian Reid (Apr '85),then Rich Hess
% added more fun to it (May '88). It scattered randomly sized black and white 
% flowers along the bottom of the screen. They were about an inch tall.
% I adapted it to large colorful flowers. Then I got ambitious because I liked
% too many different variations and I made one where I could change my
% garden interactively, rather than rewriting the code every time I wanted
% a new color.Caveat: Sometimes the window manager times out. Also, I have
% never run this on a black and white monitor.
% 
% To execute, crank up NeWS on your Sun and psh the program. There is a menu
% in it to change various characteristics of the flowers. You can also add
% the poundsign-bang-psh line to just plain run it.
%
% Elaine "booter" Richards June 28, 1988
%
% Feel free to distribute, but give the three authors some credit.
% Remember to edit out the headers :-)

/red ColorDict /Red get def
/blue ColorDict /Blue get def
/yellow ColorDict /Yellow get def
/green ColorDict /Green get def
/lavender ColorDict /Orchid get def
/thistle ColorDict /Thistle get def
/pink ColorDict /Plum get def
/orange ColorDict /Orange get def
/background ColorDict /LightBlue get def
/black ColorDict /Black get def
%Common Bootist typo
/pathbox pathbbox def
/gardenlabel {
	numberofflowers petangle npetals ( % Petals % Petangle % Flowers )sprintf 
}def
/paintflower {
	win /FrameLabel gardenlabel put
	/paint win send
	} def
/npetals	4 def
/petangle	360 npetals div  def
/thecurrentcolor	red def
/numberofflowers	1 def
%
/flower {
	gsave 
	black setcolor
	1 200 div dup scale currentpoint translate
%stem
	0 10 moveto
	-6 7 -7 70 2 95 curveto
	6 105 17 152 12 183 curveto
	gsave
	black setcolor
	9 setlinewidth
	stroke
	grestore
	5 setlinewidth
	green setcolor
	stroke
%right leaf
	newpath
	-20 0 moveto
	10 0 lineto
	13 35 43 90 71 120 curveto
	40 105 -3 40 -20 0 curveto
	gsave
	green setcolor fill
	grestore
	black setcolor
	2 setlinewidth stroke
%left leaf
	-20 0 moveto
	10 0 lineto
	0 40 -30 96 -55 140 curveto
	-35 85 -19 35 -20 0 curveto
	gsave
	green setcolor fill
	grestore
	2 setlinewidth
	stroke
%petals
	gsave
	12 183 translate
	1 0.7 scale
	1 setlinewidth
	/petlength 55 def
	/dy petangle sin petlength mul def petangle 2 div rotate
	npetals {
		newpath 0 0 moveto
		petlength dy petlength dy neg 0 0 curveto
		gsave
		thecurrentcolor setcolor fill
		grestore
		black setcolor stroke %cartoony line around flowers
		petangle rotate
		} repeat
%center of flower
	yellow setcolor
	newpath 0 0 12 0 360 arc fill
	newpath 0 0 12 0 360 arc black setcolor stroke
grestore
grestore
} bind def
%
/garden{
	gsave
	100 0 moveto
	130 130 scale
	gsave
		framebuffer setcanvas
		clippath pathbbox
		pop exch pop exch pop
	grestore
	100 sub 130 div
%conditional where
	dup currentpoint pop exch gt
%then
	{pop exit} 
%else
	{
		numberofflowers{
		gsave
		random 2 mul random 2 mul scale 
		flower
		grestore
		random 0 rmoveto
		}repeat
	} ifelse
grestore
	} def
/drawicon{
	gsave
	50 0 moveto
	30 30 scale
	flower
	grestore
}def
/makegarden { gsave background fillcanvas garden clippath grestore } def
/Draw { makegarden} def
/getmenunumber	{/currentkey self send cvr} def
/main {
%
% Submenus
%
/numberofpetalmenu
	[ (4) (8) (12) (16) (32) ]
	[ {/npetals getmenunumber store 
	   /petangle 360 npetals div store
	    paintflower}]
	/new DefaultMenu send def
/petanglemenu
	[ (360) (780) ]
	[ { /petangle getmenunumber npetals div store paintflower}]
	/new DefaultMenu send def
/numberofflowersmenu
	[ (1) (2) (5) (10) ]
	[ { /numberofflowers getmenunumber store paintflower}]
	/new DefaultMenu send def
/colormenu
	[
	(red) {/thecurrentcolor red store paintflower}
	(blue) {/thecurrentcolor blue store paintflower}
	(orange) {/thecurrentcolor orange store paintflower}
	(pink)	{/thecurrentcolor pink store paintflower}
	(thistle)	{/thecurrentcolor thistle store paintflower}
	]
	/new DefaultMenu send def
%
/win framebuffer /new DefaultWindow send def % Create a window
	{
	/FrameLabel gardenlabel def
	/PaintClient {Draw } def
	/PaintIcon {drawicon} def
	/ClientMenu [
		(Petals => )	numberofpetalmenu
		(Angle of Petals =>)	petanglemenu
		(Number of Flowers =>) numberofflowersmenu
		(Colors =>)	colormenu
		(Quit)	{currentprocess killprocessgroup}
	] /new DefaultMenu send def
	} win send
	/reshapefromuser win send
	/map win send
} def

main