Simppeli Barnsley Fern 8th-ohjelmointikielellä. Laskee matriiseilla ja näyttää lopputuloksen GUI-ikkunassa.
true app:isgui !
var gui
: WIDTH 500 ;
: HEIGHT 420 ;
: SCALE 40 ;
: ITERATIONS 1000000 ;
WIDTH HEIGHT img:new var, buffer
[ ` [ 0.00, 0.00, 0.00, 0.16 ] [ 2, 2] mat:new ` ,
` [ 0.85, 0.04, -0.04, 0.85 ] [ 2, 2] mat:new ` ,
` [ 0.20, -0.26, 0.23, 0.22 ] [ 2, 2] mat:new ` ,
` [ -0.15, 0.28, 0.26, 0.24 ] [ 2, 2] mat:new ` ] var, abcd
[ ` [ 0.00, 0.00 ] [ 2, 1 ] mat:new ` ,
` [ 0.00, 1.60 ] [ 2, 1 ] mat:new ` ,
` [ 0.00, 1.60 ] [ 2, 1 ] mat:new ` ,
` [ 0.00, 0.44 ] [ 2, 1 ] mat:new ` ] var, ef
[ ` [ 0, 0 ] [ 2, 1 ] mat:new ` ] var, xy
[ ( r@ 10 n:> not ) , ( abcd @ 0 a:@ nip xy @ a:len n:1- a:@ nip mat:* ef @ 0 a:@ nip mat:+ ) ,
( r@ 1 n:> r@ 86 n:> not and ) , ( abcd @ 1 a:@ nip xy @ a:len n:1- a:@ nip mat:* ef @ 1 a:@ nip mat:+ ) ,
( r@ 86 n:> r@ 93 n:> not and ) , ( abcd @ 2 a:@ nip xy @ a:len n:1- a:@ nip mat:* ef @ 2 a:@ nip mat:+ ) ,
( abcd @ 3 a:@ nip xy @ a:len n:1- a:@ nip mat:* ef @ 3 a:@ nip mat:+ ) ] var, when-table
: rand100
rand-pcg n:abs 100 n:mod ;
: fern
rand100 >r
when-table @ a:when
xy @ swap a:push drop
rdrop ;
: draw-image
1 mat:get-n n:neg SCALE n:* HEIGHT n:+ n:int swap
0 mat:get-n SCALE n:* WIDTH 2 n:/ n:+ n:int nip
"green" img:pix! ;
: do-draw
buffer @ 0 0 g:image-at drop ;
: app:main
' fern ITERATIONS times
buffer @ xy @ ' draw-image a:each! 2drop
{
kind: "win",
title: "Fern",
wide: ` WIDTH ` ,
high: ` HEIGHT ` ,
bg: "black",
center: true,
resizable: false,
font: "Arial 10",
draw: "do-draw"
}
g:new gui ! ;Sain 8th foorumilla parannusehdotuksia ja näköjään versiosta 19 lähtien on ollut tuettuna "constant" sana, mikä parantaa koodin luettavuutta huimasti!
true app:isgui !
500 constant WIDTH
420 constant HEIGHT
40 constant SCALE
1000000 constant ITERATIONS
WIDTH HEIGHT img:new var, buffer
[ 0.00, 0.00, 0.00, 0.16 ] [ 2, 2] mat:new constant A
[ 0.85, 0.04, -0.04, 0.85 ] [ 2, 2] mat:new constant B
[ 0.20, -0.26, 0.23, 0.22 ] [ 2, 2] mat:new constant C
[ -0.15, 0.28, 0.26, 0.24 ] [ 2, 2] mat:new constant D
[ 0.00, 0.00 ] [ 2, 1 ] mat:new constant E
[ 0.00, 1.60 ] [ 2, 1 ] mat:new constant F
[ 0.00, 1.60 ] [ 2, 1 ] mat:new constant G
[ 0.00, 0.44 ] [ 2, 1 ] mat:new constant H
\ This is the most recently calculated point:
[ 0, 0 ] [ 2, 1 ] mat:new var, xy
\ Put the most likely or common items first in the 'when' test:
[
( dup 11 85 n:between ) , ( B xy @ mat:* F mat:+ ) ,
( dup 11 n:< ) , ( A xy @ mat:* E mat:+ ) ,
( dup 86 92 n:between ) , ( C xy @ mat:* G mat:+ ) ,
( D xy @ mat:* H mat:+ ) \ else...
] var, when-table
: rand100
rand-pcg n:abs 100 n:mod ;
: draw-image \ buffer xy
over swap
1 mat:get-n SCALE n:neg n:* HEIGHT n:+ n:int swap
0 mat:get-n SCALE n:* WIDTH 2 n:/ n:+ n:int nip
"green" img:pix! ;
: fern
rand100 when-table @ a:when nip
xy xchg draw-image drop ;
: do-draw
buffer @ 0 0 g:image-at drop ;
: app:main
buffer @ ' fern ITERATIONS times
{
kind: "win",
title: "Fern",
init: ( buffer @ img:size rot drop g:size ) , \ set size according to image at runtime
bg: "black",
center: true,
resizable: false,
font: "Arial 10",
draw: "do-draw"
}
g:new ;Aihe on jo aika vanha, joten et voi enää vastata siihen.