aUCBLogo Demos and Tests / ifs


to IFS   ;I_terative F_unction S_ystem
   
maxpa=1000
   
dragon
;   LevyDragon
;   SierpinskiTriangle
;   fern
;   hexagon
;   tree
;   leaf
   
demos=
      
[   koch2
         
smiley
         
am2
         
tm30
         
feather
         
oriental
         
quadrat
         
quadrat2
         
rosette
         
rosette2
         
star
         
star1
         
star3
         
star4
         t
         
t1
         
t6
         
t8
         
universe
      
]
      
   
pr [+ - chooses demoESC stops]
   
i=1;
   
forever
   
[   demo i
      
ch=readChar
      
if ch==char 27 [stop]
      
if ch=="+ [if i<count demos [i=i+1]]
      
if ch=="- [if i>1           [i=i-1]]
   
]
end

to demo nr
   
IFSLoad word demos.nr ".ifs
   
(print word nr ") demos.nr)
   
initProbabilites
   
initGraph
   
IFSLoop
end

to initProbabilites
   
pa=Array maxpa
   
k=1
   
for [n]
   
[   for [j k p.i]
      
[   
;(show j i)
          
pa.j=i
      
]
      
k=p.i
   
]
;show p
;show pa
end

to IFSLoop
   
until [key?]
   
[   IFSiterate
   
]
end

to init
   
n=count p
   
p0=0
   
for [n]
   
[   p.i=p0+p.i
      
p0=p.i
   
]
   
p=p*maxpa/(max p)

   
initProbabilites
   
initGraph
   
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=round p*maxpa/(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
   
x=0
   
y=0
   
cs ht 
;   noRefresh
end   

to IFSiterate
   
repeat 1000
   
[   z=1+random maxpa
      
dk=d.(pa.z)
      
xxdk.1*dk.2*dk.5
      
yydk.3*dk.4*dk.6

      
xix0+xx*sk
      
yiy0+yy*sk

;      if   (xi >-400) and2 (xi < 400) 
;      and2 (yi >-300) and2 (yi < 300)
;      [
         
setPixel (list xi yipa.z
         
x=xx
         
y=yy
;      ]
   
]
   
updateGraph
end