## Sesc Av. Paulista - Espaço de Tecnologias e Artes
# Simulações biológicas com programação
## `https://hackmd.io/@villares/sesc-simula-bio`
### Para desenhar com Python nestes dois encontros
Vamos usar o [Thonny IDE](https://thonny.org), com um plugin que facilita usar a biblioteca [py5](py5coding.org), [intruções para instalar](https://abav.lugaralgum.com/como-instalar-py5/). Também pode ser usado o editor online [pyp5js/modopy5](https://abav.lugaralgum.com/pyp5js/py5mode/)
- Material introdutório de apoio em [abav.lugaralgum.com/material-aulas](https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/)
---
## Encontro 28/11 - Showcase
Literatura de referência: SHIFMAN, Daniel. [*Nature of code*](https://natureofcode.com).
### Autômatos celulares
- https://natureofcode.com/book/chapter-7-cellular-automata/
- Conway's Game of Life https://gist.github.com/villares/646497878b5a74eef51f876d95d912f5
### Árvore binária randomizada
- https://github.com/villares/sketch-a-day/tree/main/2023/sketch_2023_09_28
> 
### Flocking
- https://natureofcode.com/book/chapter-6-autonomous-agents/
- Com Orientação a Objetos https://github.com/villares/sketch-a-day/tree/main/2023/sketch_2023_10_31
- Com `numpy` https://github.com/villares/sketch-a-day/tree/main/2023/sketch_2023_11_23
---
## Encontro 14/11 - L-System - Sistema de Lindenmayer
> Nota: No final deste primeiro encontro conversamos também sobre mais coisas:
> - Blender + Python https://github.com/tabreturn/blender-creative-coding
> - Mais opções livres de desenho com Python https://github.com/villares/Resources-for-teaching-programming
L-Systems são as estruturas e procedimentos criados por Aristide Lindenmayer para estudar o crescimento de algas e plantas, por meio da manipulação de sequências de símbolos. As sequências são geradas por sucessivas iterações da aplicação de regras de substituição. Depois é possível interpretar essas sequências como geometria.
> Ainda sobre L-Systems, a tradução computacional dessas estruturas foi discutida pela primeira vez em Lecture Notes in Biomathematics por Przemyslaw Prusinkiewcz e James Hanan. [Mais referências](https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/LSystem.html).
### Preparando o terreno
#### Assuntos de que vamos precisar
- [Tranformações no sistema de coordenadas](https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/transformacoes_coordenadas.html)
- [Dicionários](https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/dicionarios.html)
#### translate, rotate, push_matrix e pop_matrix
Manipulando o sistema de coordenadas para desenhar linhas com um comprimento e ângulo (um pouco como coordenadas polares!). Apresentando o `push_matrix()` e o `pop_matrix()` que vamos precisar depois.
```python=
def setup():
size(600, 600)
tamanho = 100
push_matrix() # guardando o sistema de coordenadas
translate(300, 300)
rotate(radians(30))
line(0, 0, 0, -tamanho) # x0, y0, x1, y2
pop_matrix() # recuperando o sistema anterior
push_matrix() # guardando o sistema de coordenadas
translate(100, 100)
rotate(radians(30))
line(0, 0, 0, -tamanho) # x0, y0, x1, y2
pop_matrix() # recuperando o sistema anterior
```
### Dicionários no Python (dict)
Estudamos um pouco os dicionários e o metodo `.get()` usando `.get(chave, resposta_se_nao_tem_a_chave)`.
````python,
capitais = {
'SP': 'São Paulo',
'MG': 'Belo Horizonte',
'ES': 'Vitória'
}
print(capitais['RJ']) # quebra com KeyError
print(capitais.get('RO', 'não sei')) # exibe: não sei
estado = 'AM'
print(capitais.get(estado, estado) # exibe: AM
````
#### Gerando uma sequência de símbolos: A regra da alga
```python=
regras = {
'A': 'AB',
'B': 'A',
}
axioma = 'A'
iteracoes = 7
def setup():
size(600, 600)
frase_inicial = axioma
for n in range(iteracoes): # repete 7 vezes
nova_frase = ''
for simbolo in frase_inicial:
nova_frase = nova_frase + regras.get(simbolo, simbolo)
frase_inicial = nova_frase
print(nova_frase)
```
### Primeiro Exemplo completo
```python
regras = {
'X': 'F+[[X]-X]-F[-FX]+X',
'F': 'FF',
}
axioma = 'X'
iteracoes = 7
angulo = 25
tamanho = 2
def setup():
size(800, 800)
frase_inicial = axioma
for n in range(iteracoes): # repete 7 vezes
nova_frase = ''
for simbolo in frase_inicial:
nova_frase = nova_frase + regras.get(simbolo, simbolo)
frase_inicial = nova_frase
print(len(nova_frase))
translate(300, 700)
for simbolo in nova_frase:
if simbolo == 'F':
line(0, 0, 0, -tamanho)
translate(0,-tamanho)
elif simbolo == '+':
rotate(radians(-angulo))
elif simbolo == '-':
rotate(radians(angulo))
elif simbolo == '[':
push_matrix()
elif simbolo == ']':
pop_matrix()
```

### Acrescentando desenho em 3D

```python
regras = {
'X': 'F+[[X]-X]-F[-FX]+X',
'F': 'FF',
}
axioma = 'X'
iteracoes = 7
angulo = 25
tamanho = 2
def setup():
global nova_frase
size(800, 800, P3D)
frase_inicial = axioma
for n in range(iteracoes): # repete 7 vezes
nova_frase = ''
for simbolo in frase_inicial:
nova_frase = nova_frase + regras.get(simbolo, simbolo)
frase_inicial = nova_frase
print(len(nova_frase))
def draw():
background(200, 240, 240)
translate(300, 700)
rotate_y(radians(frame_count * 2))
for simbolo in nova_frase:
if simbolo == 'F':
rotate_y(angulo)
stroke_weight(1)
stroke(0) # traço preto
line(0, 0, 0, -tamanho)
translate(0,-tamanho)
elif simbolo == '+':
rotate(radians(-angulo))
elif simbolo == '-':
rotate(radians(angulo))
elif simbolo == '[':
push_matrix()
elif simbolo == ']':
pop_matrix()
elif simbolo == 'X':
stroke_weight(tamanho)
stroke(255, 0 , 0) # RGB
point(0, 0)
```