aUCBLogo Demos and Tests / pursuittest


to pursuittest   ;for aUCBLogo
   ;Original by Mike Sandy (a bit extended with randoms and zoom)
   
pursuit 100 200
end

to pursuit n r
   
;n number of sides
   ;r distance from centre to vertex
   
local [pos_list ang d dmin i]
   
pos_list=[]    ;COORDINATE LIST
   
ang=360/n
   
d=2*r*sin ang/2
   
clearScreen PenUp hideTurtle
   
forward :r
   
left 90+ang/2
   
repeat n                ;DRAW POLYGON STORE COORDS. IN LIST
   
[   pos_list=fput pos pos_list
      
fd lt ang
      
ang=random 360
      
setPos (list sin ang cos ang)*random r
   
]
   
dmin=0.1
   
i=0
   
catch "stopping
   
[   pursuitHelper 1
   
]
end

to zoom
   
local [p minx miny maxx maxy pmin pmax size newPosList]
   
minx=0   miny=0
   
maxx=0   maxy=0
   
foreach pos_list
   
[   p=?
      
if p.1 minx [minx=p.1]
      
if p.2 miny [miny=p.2]
      
if p.1 maxx [maxx=p.1]
      
if p.2 maxy [maxy=p.2]
   
]
   
pmin=list minx miny
   
pmax=list maxx maxy
   
size=pmax-pmin
   
if size.1==or2 size.2==0
   
[   throw "stopping
   
]
   
newPosList=pos_list
   
foreach pos_list
   
[   newPosList.repcount=((?-pmin)/size)*2*r-r
   
]
   
pos_list=newPosList
   
posn=((posn-pmin)/size)*2*r-r
   
clearScreen
   
setPos posn
end

to pursuitHelper d
   
;d IS THE DISTANCE TRAVELLED TOWARDS NEXT POSITION
   ; THE SMALLER d THE MORE ACCURATE THE PLOT
   
if dmin Norm pos_list.(int n/2)-pos_list.1 [stop]
   
posn=first pos_list
   
seth towards posn
   
setPenColor HSB 360*i/(n-11 1
   
pd forward d
   
PenUp   ;ALTERNATIVELY COMMENT OUT THIS PenUp (BUT INCREASE d)
   
pos_list=lput Pos butFirst pos_list
   
setPos posn
   
i=i+1
   
if n
   
[   i=0
      
updateGraph
      
if Key?
      
[   c=readChar
         
if c==char 27 [throw "stopping]
         
zoom
      
]
   
]
   
pursuitHelper d
end