to IFS2 ;I_terative F_unction S_ystem setScreenColor 0 allFullScreen (splitScreen 0.9) trafomode=true maxi2=16 maxi=Int 2^maxi2 palsize=256 pal=IntArray loadPalette "ifs.pal dragon ; LevyDragon ; SierpinskiTriangle ; fern ; hexagon ; tree ; leaf demos= [ koch2 smiley am2 tm30 feather oriental quadrat quadrat2 rosette rosette2 star star1 star3 star4 t t6 t8 universe ] pr [+ - chooses demo, ESC stops] i=1 io=0 running=true while [running] [ if i != io [ initDemo i io=i ] IFSLoop ch=readChar case ch [ [[char 27] running=false] ["+ if i1 [i=i-1]] ["\ trafomode=not trafomode] ["c clearScreen] ] ] notFullScreen splitScreen end to initDemo nr IFSLoad word demos.nr ".ifs (print word nr "\) demos.nr) initProbabilites initGraph runtime=Int 0 end to initProbabilites pa=Array maxi2 pai=Int (ln n)/ln 2 for [l pai maxi2] [ l2=2^l pat=IntArray l2 k=1 for [i 1 n] [ kmax=Int p.i*l2 if kmax >= k [ setItems k pat IntArray rseq i i kmax-k+1 ; for [j k kmax] ; [ ;(show j i) ; pat.j=i ; ] ] k=kmax+1 ] pa.l=pat ;show p ;show pa.l pa.l=shuffle pa.l ;show pa ] maxii=Int 2^pai x=rseqFA 0 0 maxii y=rseqFA 0 0 maxii m=count d d1=FloatArray m d2=FloatArray m d3=FloatArray m d4=FloatArray m d5=FloatArray m d6=FloatArray m for [i 1 m] [ d1.i=(d.i).1 d2.i=(d.i).2 d3.i=(d.i).3 d4.i=(d.i).4 d5.i=(d.i).5 d6.i=(d.i).6 ] end to shuffle_Logo a local [n j k tmp] n=count a for [i 1 n] [ j=1+random n k=1+random n tmp=a.j a.j=a.k a.k=tmp ] end to IFSLoop until [key?] [ IFSiterate GC ] end to init n=count p p0=0 for [i 1 n] [ p.i=p0+p.i p0=p.i ] p=p/(max p) initProbabilites initGraph runtime=Int 0 IFSLoop end to dragon p={1 1} d= { { 0.5 -0.5 0.5 0.5 0 0 0.5} {-0.5 -0.5 0.5 -0.5 1 0 0.5} } sk=300 x0=0 y0=0 init end to LevyDragon p={1 1} d= { {0.5 -0.5 0.5 0.5 0 0 } {0.5 0.5 -0.5 0.5 0.5 0.5} } sk=350 x0=-170 y0=-120 init end to SierpinskiTriangle p={1 1 1} d= { {0.5 0 0 0.5 0 0 } {0.5 0 0 0.5 0.5 0 } {0.5 0 0 0.5 0.25 0.433} } sk=600 x0=-300 y0=-300*(sqrt 3)/2 init end to fern p={10 70 70 850} d= { { 0.00 0.00 0.00 0.16 0.00 0.00} { 0.20 -0.26 0.23 0.22 0.00 1.60} {-0.15 0.28 0.26 0.24 0.00 0.44} { 0.85 0.04 -0.04 0.85 0.00 1.60} } sk=50 x0=0 y0=-250 init end to hexagon p={200 100 100 200 1000} d= { {0.333333 0 0 0.333333 -0.333333 0} {0.166667 -0.288675 0.288675 0.166667 -0.0833333 0.144337} {0.166666 0.288675 -0.288675 0.166666 0.0833333 0.144337} {0.333333 0 0 0.333333 0.333333 0} {0.506667 -0.859357 0.859357 0.506667 0.25 -0.433012} } sk=300 x0=-150 y0=0 init end to tree p={400 100 1000 1000} d= { {0 0 0 0.5 0 0} {0.1 0 0 0.1 0 0.2} {0.42 -0.42 0.42 0.42 0 0.2} {0.42 0.42 -0.42 0.42 0 0.2} } sk=1200 x0=0 y0=-300 init end to leaf p={150 150 150 500} d= { {0.95 -0.1 0.1 0.95 0.45 0.075} {0.35 -0.5 0.5 0.35 0 0.45} {0.55 0.43 -0.43 0.55 0 0.44} {0.85 0.05 -0.05 0.85 0 1.6} } sk=40 x0=0 y0=-200 init end to readNumber local "w w=readWord if (first w)=="| | [ w=bf w ] output w+0 end to ifsLoad filename openRead filename setReader filename n=readNumber+1 p=array n d=array n for [i 1 n] [ di=array 6 for [j 1 6] [ di.j=readNumber ] d.i=di p.i=readNumber ] sk=readNumber x0=readNumber-400 y0=300-readNumber setReader [] close filename p=p/(max p) (pr "p= p) (pr "d= d) (pr "sk= sk) (pr "x0= x0) (pr "y0= y0) end to IFSLoad2 filename openRead filename setReader filename repeat 3 [ignore readWord] x=readList y=readList sk=600*(x.2-x.1) x0=x.1+x.2 y0=y.1+y.2 ignore readWord n=readNumber repeat 2 [ignore readWord] d=array n for [i 1 n] [ l=readList d.i=listToArray (list l.1 l.4 l.3 l.2 l.5 l.6) ] repeat 2 [ignore readWord] p=listToArray readList setReader [] close filename init (pr "p= p) (pr "d= d) (pr "sk= sk) (pr "x0= x0) (pr "y0= y0) end to initGraph cs ht noRefresh ; singleBuffer PenUp setXY -400 -300 bm=Bitcopy 800 600 bx=BitMaxX bm by=BitMaxY bm t=16 PenDown end to IFSiterate local [p] p=pa.pai for [i 1 2] [ xx= d1.p*x + d2.p*y + d5.p yy= d3.p*x + d4.p*y + d6.p xi= xx*sk+x0 yi= yy*sk+y0 if runtime > -1 [ ifelse trafomode [ setPixelXY xi yi (mod p-1 15)+1 ][ ; setPixelXY xi yi pal.Int t ; ] ; ignore[ xb=xi-400 yb=yi-300 for [j 1 [count x]] [ c=addColorsMod (BitPixel bm xb.j yb.j) pal.Int t BitSetPixel bm xb.j yb.j c setPixelXY xi.j yi.j c ] ] ] ox=x oy=y x=xx y=yy p=rotate p random maxii t=(mod t palsize)+1 runtime+=1 ] pa.pai=p ifelse pai < maxi2 [ pai=pai+1 maxii=maxii*2 x=combine x ox y=combine y oy ][ updateGraph dispatchMessages if Key? [break] ] end