# Grupo de estudos em Python
## Gestos
## `https://hackmd.io/@sesc-av-paulista/estudos-em-python-20-marco`
### Primeiro exemplo com lista
```python=
pontos = []
def setup():
size(600, 600)
def draw():
background(0, 0, 100)
for x, y in pontos:
fill(random(255), 200)
circle(x, y, random(10, 30))
def mouse_dragged():
pontos.append((mouse_x, mouse_y))
```

```python
>>> for t in enumerate(frutas):
print(t)
(0, 'avocado')
(1, 'mamão')
(2, 'manga')
>>> for numero, fruta in enumerate(frutas, 1):
print(numero, fruta)
1 avocado
2 mamão
3 manga
```
## Exemplo com `deque`

```python=
from collections import deque
pontos = deque(maxlen=300)
def setup():
size(600, 600)
color_mode(HSB) # Hue(matiz), Sat, Bri
def draw():
background(0, 0, 100)
for i, (x, y) in enumerate(pontos):
f = i + frame_count
fill(f % 255, 200, 200)
circle(x, y, f % 100)
# d = 30 + 20 * sin(radians(f))
# circle(x, y, d)
def mouse_dragged():
pontos.appendleft((mouse_x, mouse_y))
print(len(pontos))
def key_pressed():
if key == ' ':
pontos.clear()
```
### Gesto 2D

```python=
"""
Gesto em 2D
"s" para salvar e barra de espaço para recomeçar
Sketch escrito em estilo "module mode"
No Thonny, use com o plguing py5 "imported mode" desativado
"""
from collections import deque # a double-ended queue
import py5 # check out https://github.com/py5coding
from py5_tools import animated_gif
history = deque(maxlen=360) # mouse dragged positions
def setup(): # py5 will call this once to set things up
py5.size(600, 600)
py5.color_mode(py5.HSB)
py5.no_stroke()
def draw(): # py5 will call this in a loop
py5.background(0)
for i, (x, y) in enumerate(history):
h = py5.remap((i - py5.frame_count) % 360, 0, 360, 0, 255)
d = py5.remap((i - py5.frame_count) % 360, 0, 360, 8, 32)
py5.fill(h , 255, 255, 150)
py5.circle(x, y, d)
if history:
history.append(history.popleft()) # circula os valores do deque
# remove da esquerda (começo) e acrescenta na direita (append normal no fim)
def mouse_dragged(): # py5 will call this when you drag the mouse
history.append((py5.mouse_x, py5.mouse_y))
def key_pressed(): # py5 will call this when a key is pressed
if py5.key == ' ':
history.clear()
elif py5.key == 's':
f = py5.frame_count
animated_gif(f'2D-{py5.frame_count}.gif', frame_numbers=range(f + 1, f + 361, 4), duration=0.075)
py5.run_sketch()
```
### Gesto 3D

```python
"""
Gesto em 3D
"s" para salvar e barra de espaço para recomeçar
Sketch escrito em estilo "module mode"
No Thonny, use com o plguing py5 "imported mode" desativado
"""
from collections import deque # a double-ended queue
import py5 # check out https://github.com/py5coding
from py5_tools import animated_gif
history = deque(maxlen=360) # mouse dragged positions
def setup(): # py5 will call this once to set things up
py5.size(600, 600, py5.P3D)
py5.color_mode(py5.HSB)
def draw(): # py5 will call this in a loop
py5.background(0)
for i, (x, y, r) in enumerate(history):
with py5.push_matrix():
py5.translate(py5.width / 2, py5.height / 2) # origem no meio da tela
py5.rotate_y(r - py5.radians(py5.frame_count)) # rotação geral
py5.translate(-py5.width / 2, -py5.height / 2) # volto sistema de coordenadas
h = py5.remap((i - py5.frame_count) % 360, 0, 360, 0, 255)
py5.fill(h , 255, 255, 150)
py5.no_stroke()
py5.translate(x, y) # (i + py5.frame_count) % 3 - 1)
#py5.rotate_y(-r + py5.radians(py5.frame_count)) # virar bolinha para camera
d = py5.remap((i - py5.frame_count) % 360, 0, 360, 8, 32)
py5.circle(0, 0, d)
if history:
history.append(history.popleft())
def mouse_dragged(): # py5 will call this when you drag the mouse
history.append((py5.mouse_x, py5.mouse_y, py5.radians(py5.frame_count)))
def key_pressed(): # py5 will call this when a key is pressed
if py5.key == ' ':
history.clear()
elif py5.key == 's':
f = py5.frame_count
animated_gif(f'3D-{py5.frame_count}.gif', frame_numbers=range(f + 1, f + 361, 4), duration=0.075)
py5.run_sketch()
```
# Gesto que anda!

```python
from collections import deque
gestos = deque([], maxlen=10)
gesto_em_curso = deque()
print(gestos)
def setup():
size(600, 600)
color_mode(HSB)
def draw():
background(0, 0, 100)
for i, gesto in enumerate(gestos):
fill((i * 16) % 255, 200, 200)
for x, y in gesto:
circle(x, y, 15)
anima_gesto(gesto)
no_fill()
for x, y in gesto_em_curso:
circle(x, y, 15)
def anima_gesto(gesto):
if len(gesto) > 2: # deque vazio é "falseane" ("falsy")
a = gesto.pop() # pega o último ponto/vetor (e remove do final deque)
b = gesto[-1] # é o penúltimo que agora é o último...
r = b - a # vetor de deslocamento do último para o penúltimo ponto
p = gesto[0]
pr = p + r # aplicando o vetor no primeiro ponto/vetor
# pular as bordas da tela
pr.x = pr.x % width
pr.y = pr.y % height
gesto.appendleft(pr) # acrescenta o novo primeito ponto
def mouse_dragged():
if dist(mouse_x, mouse_y, pmouse_x, pmouse_y) > 2:
gesto_em_curso.append(Py5Vector(mouse_x, mouse_y))
def mouse_released():
gestos.append(gesto_em_curso.copy())
gesto_em_curso.clear()
def key_pressed():
if key == ' ':
pontos.clear()
```
Com subtração do vetor temos uns movimentos cíclicos no lugar em vez de andar longe.
