USING: accessors arrays calendar colors kernel math math.constants math.functions math.parser math.primes.erato.fast math.vectors opengl processing.shapes sequences timers ui ui.gadgets ui.gadgets.cartesian ; IN: digits-viz TUPLE: turtle pdown direction position lines ; : ( -- turtle ) t pi 2 / { 0.0 0.0 } clone V{ } clone turtle boa ; > [ 2array '[ _ suffix! ] change-lines ] [ 2drop ] if ; inline PRIVATE> : fwd ( turtle steps -- turtle ) over direction>> [ cos * ] [ sin * ] 2bi 2array over position>> [ v+ ] keep [ line ] keepd >>position ; : trn ( turtle rads -- turtle ) over direction>> + >>direction ; inline : pdn ( turtle -- turtle ) t >>pdown ; inline : pup ( turtle -- turtle ) f >>pdown ; inline CONSTANT: base 10 CONSTANT: scale 0.1 TUPLE: digits-viz < cartesian turtle digits timer ; M: digits-viz graft* [ timer>> start-timer ] [ call-next-method ] bi ; M: digits-viz ungraft* [ timer>> stop-timer ] [ call-next-method ] bi ; : init-digits ( -- digits ) 100 sieve V{ } [ base >base-digits append! ] reduce ; : next-line ( digits-viz -- ) dup digits>> [ unclip [ >>digits ] dip over turtle>> swap base / pi 2 * * trn 10 fwd drop ] unless-empty relayout-1 ; : update-range ( digits-viz -- digits-viz ) dup pref-dim [ [ 0 swap - ] keep 2array scale 2 / v*n ] map first2 [ x-range ] dip y-range ; : draw-digits ( digits-viz -- ) COLOR: black gl-color turtle>> lines>> [ first2 draw-line* ] each ; : ( -- gadget ) digits-viz new init-cartesian { 800 800 } >>pdim >>turtle init-digits >>digits dup '[ _ next-line ] f 250 milliseconds >>timer dup '[ COLOR: white gl-clear _ update-range draw-digits ] >>action ; MAIN-WINDOW: digits-viz-window { { title "Digits Visualization" } } >>gadgets ;