aUCBLogo Demos and Tests / ifs2


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 demoESC stops]
   
i=1
   
io=0
   
running=true
   
while [running]
   
[   if != io
      
[   initDemo i
         
io=i
      
]
      
IFSLoop
      
ch=readChar
      
case ch
      
[   [[char 27running=false]
         
["+ if i<count demos [i=i+1]]
         
["- if i>1           [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 [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 [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 [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 [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 [n]
   
[   di=array 6
      
for [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 [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 [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 [1 2]
   
[   xxd1.p*d2.p*d5.p
      
yyd3.p*d4.p*d6.p

      
xixx*sk+x0
      
yiyy*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 [[count x]]
            
[   c=addColorsMod (BitPixel bm xb.j yb.jpal.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