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
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