aUCBLogo Demos and Tests / draw_medians


;draw_medians by Brian Harvey

be draw_medians [:command [repeat [fd 200 rt 90]]][:num 10]
   
setRedefinable true
   
if not procedurep "real_fd [
     
copydef "real_fd "::fd
     
copydef "real_setpos "::setpos
     
copydef "real_setxy "::setxy
   
]
   
defineBe "draw_medians::fd [[dist] [localmake "old pos]
            
[real_fd :dist]
            
[push "medians median :old pos]]
   
defineBe "draw_medians::forward [[dist] [localmake "old pos]
               
[real_fd :dist]
               
[push "medians median :old pos]]
   
defineBe "draw_medians::setpos [[newpos] [localmake "old pos]
             
[real_setpos :newpos]
             
[push "medians median :old pos]]
   
defineBe "draw_medians::setxy [[newx newy] [localmake "old pos]
               
[real_setxy :newx :newy]
               
[push "medians median :old pos]]
   
localmake "medians []
   
localmake "startpos pos
   
ignore error
   
catch "error :command
   
err=error
   
if not emptyp err
   
[   print (word first butFirst err 
         
"\ in\  first bf bf err
         
"( first bf bf bf bf err "))
   
]
   
if equalp pos :startpos [push "medians last :medians]
   
if emptyp error [catch "error [median_trace :num reverse :medians]]
   
copydef "fd "real_fd
   
copydef "forward "real_fd
   
copydef "setpos "real_setpos
   
copydef "setxy "real_setxy
   
erase [real_fd real_forward real_setpos real_setxy]
   
setRedefinable false

   
be median :pos1 :pos2
      
output list 
         
((first :pos1)+(first :pos2))/2 
         
(( last :pos1)+( last :pos2))/2
   
end
   
   
be median_trace :num :positions
      
if :num==[stop]
      
pu setpos first :positions
      
localmake "medians []
      
localmake "startpos pos
      
pd foreach bf :positions [setpos ?]
      
if equalp pos :startpos [push "medians last :medians]
      
median_trace :num-reverse :medians
   
end
end