Essa página é uma cópia que traduzi da original publicada em http://users.senet.com.au/%7Ekerrb/fractals/howto/erich.html, uma vez que a página não está mais disponível.
Ao final, encontra-se a versão original do texto em inglês.

email de Erich Neuwirth para o autor:-

... e eu acho que o código poderia ser melhorado um pouco. Eu acho que você não deveria usar procedimentos diferentes para diferentes versões da samambaia (fern), mas você deve ter um parâmetro adicional a fazer o ajuste, algo como

to fern :size :angle.var
if :size < 5 [stop]
fd :size / 20
lt 80 fern :size * 0.3 :angle.var
rt 82 + :angle.var fd :size / 20
rt 80 fern :size * 0.3 :angle.var
lt 78 - :angle.var fern :size * 0.9 :angle.var
lt 2 + :angle.var bk :size / 20
lt 2 + :angle.var bk :size / 20
end

E você poderia usar rseq para gerar uma lista de ângulos variáveis e então usar o foreach com essa lista para o "filme"

to make.movie
localmake "append "false
setactivearea [-100 -20 140 200]
foreach sentence (rseq 0 2 11) (rseq 2 0 11) ~
[cs ~
(fern 200 ?) ~
(gifsave "fern.gif 100 :append 0) make "append "true]
end

----------------

Ao fazer um animação, rseq e foreach em geral são muito importantes.

E onde você está usando run em seu código, você poderia utilizar apply ou invoke

-----------------------------

Aqui está uma versão ligeiramente modificada. Eu adicionei, cor e a velocidade do movimento é menor nos extremos para dar uma melhor impressão de "balanço"

to make.movie
ht
localmake "append "false
setpc [10 200 15]
setactivearea [-200 -40 280 400]
foreach map [1 + cos ?] (rseq 0 360 81) ~
[cs ~
(fern 400 ?) ~
(gifsave "fern.gif 50 :append 0) make "append "true]
st
setpc [0 0 0]
end

-------------------------------

Aqui está outra versão. Ela altera a curvatura dos ramos para a esquerda e para a direita. A temporização é melhor, e também a cor é diferente.

to fern :size :angle.var :par
if :size < 5 [stop]
fd :size / 20
lt :par * 80
fern :size * 0.3 :angle.var :par
rt :par * (82 + :angle.var)
fd :size / 20
rt :par * 80
fern :size * 0.3 :angle.var (-1 * :par)
lt :par * (78 - :angle.var)
fern :size * 0.9 :angle.var :par
lt :par * (2 + :angle.var)
bk :size / 20
lt :par * (2 + :angle.var)
bk :size / 20
end

to make.movie
ht
localmake "append "false
setpc [10 150 15]
setactivearea [-200 -40 280 400]
foreach map [1 + cos ?] (rseq 0 360 81) ~
[cs ~
(fern 400 ? 1) ~
(gifsave "fern.gif 5 :append 0) make "append "true]
st
setpc [0 0 0]
end

Segue versão original:


email from Erich Neuwirth to the author:-

... and I think your code could be improved a little bit. I think you should not use different procedures for different versions of the fern, but you should have an additional parameter doing the tweaking, something like

to fern :size :angle.var
if :size < 5 [stop]
fd :size / 20
lt 80 fern :size * 0.3 :angle.var
rt 82 + :angle.var fd :size / 20
rt 80 fern :size * 0.3 :angle.var
lt 78 - :angle.var fern :size * 0.9 :angle.var
lt 2 + :angle.var bk :size / 20
lt 2 + :angle.var bk :size / 20
end

Then you could use rseq to generate a list of variational angles and then you should use foreach with this list to create the movie

to make.movie
localmake "append "false
setactivearea [-100 -20 140 200]
foreach sentence (rseq 0 2 11) (rseq 2 0 11) ~
[cs ~
(fern 200 ?) ~
(gifsave "fern.gif 100 :append 0) make "append "true]
end

----------------

When doing animation, rseq and foreach in general are very important.

And where you are using run in your code, alternatives would be apply or invoke

-----------------------------

Here is a slightly modified version. I added color, and the speed of the movement is slow at the extremes to give a better impression of "swaying"

to make.movie
ht
localmake "append "false
setpc [10 200 15]
setactivearea [-200 -40 280 400]
foreach map [1 + cos ?] (rseq 0 360 81) ~
[cs ~
(fern 400 ?) ~
(gifsave "fern.gif 50 :append 0) make "append "true]
st
setpc [0 0 0]
end

-------------------------------

Here is another version, it chages the curvatore for the left and the right branches. timing is better, and the color also is different.

to fern :size :angle.var :par
if :size < 5 [stop]
fd :size / 20
lt :par * 80
fern :size * 0.3 :angle.var :par
rt :par * (82 + :angle.var)
fd :size / 20
rt :par * 80
fern :size * 0.3 :angle.var (-1 * :par)
lt :par * (78 - :angle.var)
fern :size * 0.9 :angle.var :par
lt :par * (2 + :angle.var)
bk :size / 20
lt :par * (2 + :angle.var)
bk :size / 20
end

to make.movie
ht
localmake "append "false
setpc [10 150 15]
setactivearea [-200 -40 280 400]
foreach map [1 + cos ?] (rseq 0 360 81) ~
[cs ~
(fern 400 ? 1) ~
(gifsave "fern.gif 5 :append 0) make "append "true]
st
setpc [0 0 0]
end