skdutta@cs.tamu.edu (Saumen K Dutta) (06/16/90)
----------X CUT HERE X---------X CUT HERE X------------ %! % % Postscript Spirograph: Written by S. K. Dutta % % % % Here is a postscript spirograph program that simulates a real spirograph. % A spirograph is formed by rotating a vector on an axis which itself % rotates on some other axis. This gives rise to interesting figures. % % Description: % % Following are the description of postscript control variables % % r1 - This is the radius of the outer circle and is kept at 0.5 so that % the picture totally covers the area of the paper. % r2 - Changable radius of the wheel which rotates on r1. The value is % less than or equal to r1 % r3 - The radius where the hole exist on the circle r2. In real spirograph % a pen is moved through this hole and the circle r2 is rotated % on r1. r3 should be less than or equal to r2. % % The values of r2 and r3 are kept in the operand stack before the % program starts. For multiple spirals on the same page you are % required to push multiple values of r2 and r3 into the stack in % the same order. % /r1 0.5 def % The value of r1 is fixed (don't change it ! ) % /thetha 10 def % thetha may be varied to control smoothness % % We now put the values of r2 and r3 into the stack. The following % points must be noted while selecting the values. % % 1. r2 and r3 must be within the second decimal places. % 2. (100 * r2) must be prime for better results. % 3. the operand stack should have even number of entries. % 4. The stack entries are put as : r2 r3 r2 r3 r2 r3 ..... % 0.31 0.29 0.47 0.1 % in stack % % Given below are some experimental values which the user can put % into stack before running the program. For this, comment the % previous line of stack entry and uncomment any of the line given % below. You can also try other combinations( refer to the restr- % ictions on the values of r2 and r3 as given above). % %0.43 0.05 0.43 0.19 0.43 0.31 0.43 0.42 %0.33 0.09 0.17 0.05 0.47 0.25 %0.41 0.3 % % BUGS & Limitations: % % 1. The algorithm used makes the spirograph by drawing many straight % lines. Hence the smoothness of the lines are affected. % 2. The speed of the rotating vector is not controlled. % 3. Since the number of vectors printed are very large, the printing % is slow. % /alpha { r2 thetha mul r1 div } def /findhcf { {dup 3 1 roll rmod dup 0 eq {exit}if}loop pop }def /hcf { r1 1000 mul r2 1000 mul round findhcf r1 1000 mul exch div }def /hlim { hcf 360 mul thetha div 1 add } def /rmod { 2 copy div cvi mul sub cvi } def /SpiroGraph { 1 1 hlim{ gsave 0 r1 r2 sub moveto dup alpha mul 360 rmod rotate 6 array currentmatrix exch currentpoint translate thetha mul 360 rmod -1 mul rotate 0 r3 moveto setmatrix currentpoint grestore 2 {1 index} repeat 6 -2 roll moveto lineto stroke }for } def /MainSpiral { 0 setgray 500 500 scale { count 0 eq {exit} if gsave newpath 0.6 0.7 translate /r3 exch def /r2 exch def 0 r1 r2 sub r3 add SpiroGraph pop pop grestore } loop } def 0 setlinewidth % otherwise does'nt work on NeXT! MainSpiral showpage ----------X CUT HERE X---------X CUT HERE X------------ -- _ ||Internet: skdutta@cssun.tamu.edu ( /_ _ / --/-/- _ ||Bitnet : skd8107@tamvenus.bitnet __)_/(_____(_/_(_/_(_(__(_/_______ ||Uucp : uunet!cssun.tamu.edu!skdutta .. ||Yellnet: (409) 846-8803