Try   HackMD

Processing Community Day 2023 @ Brasil

Python científico na programação criativa: o que eu aprendi até agora de numpy para usar nos meus desenhos

https://hackmd.io/@villares/numpy-na-prog-criativa

gravação da apresentação

Quem é esse Alexandre?

É aquele maluco que fica fazendo material didático aberto de programação com Processing + Python (py5), ajuda a organizar com o John a Noite de Processing, e faz um desenho por dia!

Caveat: eu não manjo de numpy de verdade!

Motivações

Referências

Livro From Python to Numpy do Nicolas Rougier

  • É praticamente um port do Nature of Code do Shiffman para Python com Numpy
  • Brincadeiras a parte:
    - Começa com random walker
    - Tem autômatos celulares / Conway's Game of Life
    - Tem fractais
    - Tem o Flocking

A documentação oficial do numpy

  • Tem em português!

A ferramenta que eu uso de Processing + Python: py5

O básico do básico do básico

  • O que são arrays?
    • coleções homogêneas de valores, úteis para representar vetores e matrizes, capazes de fazer operações entre vetores, matrizes e valores escalares.
  • um pouco do açucar sintático do Python
    • Sobrecarga dos operadores com valores escalares fazendo as operações em cada elemento do array.
    ​​​​>>> numeros = [10, 20, 30, 1, 2, 3]  # lista comum
    ​​​​>>> npa = np.array(numeros)  # array numpy
    ​​​​>>> npa * 3 + 1
    ​​​​>>> array([31, 61, 91, 4, 7, 10])
    
    • Fatias com [] e :
    • A idéia das máscaras:
      • mascara = npa < 4 é um array com valores True e False.
      • npa[mascara] = 0 indexando pela máscara permite alterar o array original só nas posições da máscara.
  • mais alguns exemplos bem simples

Mas pra que é que você usa?

Imagens

No py5, Pillow e OpenCV

Particulas / Agentes / Operações vetorizadas

  • Game of Life

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

  • Calculando pontos de uma curva [1] e [2]
    • O Processing não tem um quadraticVertex() como tem o bezierVertex(), para pegar os pontos de um forma feita com vértices quadráticos (para depois poder usar com shapely)
    ​​def quadratic_points(ax, ay, bx, by, cx, cy,
    ​​​​                     num_points=None,
    ​​​​                     first_point=False):
    ​​​​    if num_points is None:
    ​​​​        num_points = int(py5.dist(ax, ay, bx, by) + py5.dist(bx, by, cx, cy) + py5.dist(ax, ay, cx, cy)) // 10
    ​​​​    if num_points <= 2:
    ​​​​        return [(ax, ay), (cx, cy)] if first_point else [(cx, cy)]
    ​​​​    t = np.arange(0 if first_point else 1, num_points + 1) / num_points
    ​​​​    x = (1 - t) * (1 - t) * ax + 2 * (1 - t) * t * bx + t * t * cx
    ​​​​    y = (1 - t) * (1 - t) * ay + 2 * (1 - t) * t * by + t * t * cy
    ​​​​    return np.column_stack((x, y))
    
  • Simulador de Areia

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

  • Pattern binário

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

  • Perlin Noise vetorizado
  • Exemplo de Partículas ingênuas

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

  • Exemplo de Flocking

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →