## 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 > ![animação](https://lugaralgum.com/hackmd/sketch_2023_09_28.gif) ### 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() ``` ![image](https://lugaralgum.com/hackmd/SJGlYOWV6.png) ### Acrescentando desenho em 3D ![image](https://lugaralgum.com/hackmd/B11WPr-ET.png) ```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) ```