%include "edwin:specs.inc"
%include "inc:maths.imp"
%include "inc:util.imp"
%external %routine %spec RECTANGLE      %alias "ED_RECTANGLE"  (%integer XL, YL, XU, YU)
%external %routine %spec CIRCLE         %alias "ED_CIRCLE"     (%integer RAD)
!spirograph

%begin
  %include "ademo:harmrndm.inc" {"pr:random.inc"}
  %constinteger win=1000
  %constreal mult=10.0, twopi=6.28318
  %integer li,di,ri,dri,steps,revs,inc
  %real l,dr,trinc,tdinc,turn


%integerfunction hcf(%integer a,b)
  %result = b %if a=0
  %result = a %if b=0
  %result = hcf(a-b,b) %if a>b
  %result = hcf(b-a,a)
%end


%routine scribble
  %integer i
  %real tr,td,x,y

  set colour(random int(1,7))
  move abs(int pt(l+dr),0)
  tr=0.0; td=0.0

  %for i=1,1,steps %cycle
    tr=tr+trinc
    td=td-tdinc
    x= dr*cos(td)+l*cos(tr+td)
    y= dr*sin(td)+ l*sin(tr+td)
    line abs(int pt(x),int pt(y))
    %return %if test symbol # -1
  %repeat
  i= cputime + 500
  %cycle
    %exit %if test symbol # -1
  %repeat %until cputime = i
%end


%routine setup

  di=random int(50,100)
  move abs(0,0)
  newframe

  ri=random int(5,di-1)
  set colour(3)
  dri=di-ri

  li=random int(1,ri-1)
  inc=ri
  turn=twopi/inc
  revs=dri//hcf(dri,ri)
  steps=revs*inc
  trinc= turn
  tdinc=trinc*ri/dri
  l= mult*li
  dr= mult*dri
%end
  


  initialise random
  initialise for(defaultdevice)
  window(-win,win,-win,win)
  newframe
  printsymbol(27);printsymbol(118)
  newlines(3)
  printstring ("Spirograph Demo");newlines(2)
  printstring ("Hit any key to change pattern");newline
  printstring ("Hit Ctrl-Y to exit program");newlines(2)

  %cycle
    setup
    window(-win,win,-win,win)
    scribble
  %repeat

%endofprogram

