"""2025-10-28
Polígonos Redux 01
Exercício de criação de polígonos regulares com paleta de cores.
ericof.com
png
Sketch,py5,CreativeCoding
"""
from collections import deque
from sketches.padroes.poligonos import gera_poligono_regular
from sketches.utils.draw import canvas
from sketches.utils.draw.cores.paletas import gera_paleta
from sketches.utils.helpers import sketches as helpers
import numpy as np
import py5
sketch = helpers.info_for_sketch(__file__, __doc__)
dimensoes = helpers.DIMENSOES
LADOS: int = 6
LARG_MIN: int = dimensoes.internal[0] // 10
LARG_MAX: int = dimensoes.external[0]
PASSO: int = (LARG_MAX - LARG_MIN) // 40
TRACO: int = 10
TRACO_PASSO: float = 0.1
def cores_vertices(lados: int, paleta: deque) -> list[int]:
"""Gera uma lista de cores para os vértices de um polígono."""
cores = []
for _ in range(lados):
cor = paleta[0]
cores.append(cor)
paleta.rotate(1)
return cores
def setup():
py5.size(*dimensoes.external, py5.P3D)
def draw():
cor_fundo = py5.color(0)
py5.background(cor_fundo)
py5.rect_mode(py5.CORNER)
py5.shape_mode(py5.CENTER)
py5.color_mode(py5.HSB, 360, 100, 100)
py5.blend_mode(py5.BLEND)
vertices = dimensoes.vertices_interno
paleta: deque[py5.Py5Color] = gera_paleta("pastel", True)
for x, y in vertices:
traco = TRACO
with py5.push_matrix():
py5.translate(x, y, -5)
for d in range(LARG_MIN, LARG_MAX, PASSO):
cores = cores_vertices(LADOS, paleta)
forma = gera_poligono_regular(
lados=LADOS,
largura=d,
altura=d,
rotacao=np.pi / LADOS,
)
traco -= TRACO_PASSO
forma.set_fill(False)
forma.set_stroke_weight(traco)
forma.set_strokes(cores)
py5.shape(forma, 0, 0)
parametros = (
f"Params: {LADOS} - {LARG_MIN} - {LARG_MAX} - {PASSO} - {TRACO} - {TRACO_PASSO}"
)
py5.window_title(parametros)
with py5.push():
py5.translate(0, 0, 10)
canvas.draw_text_box(
parametros, style_name="transparent_white", x=20, y=950, align=py5.LEFT
)
# Credits and go
canvas.sketch_frame(
sketch, cor_fundo, "large_transparent_white", "transparent_white"
)
def key_pressed(): # noQA: C901
global LADOS, LARG_MIN, LARG_MAX, PASSO, TRACO, TRACO_PASSO
key = py5.key
match key:
case " ":
save_and_close()
case "+":
LADOS += 1
case "-":
LADOS -= 1 if LADOS > 3 else 0
case ">":
LARG_MIN += 5
case "<":
LARG_MIN -= 5 if LARG_MIN > 10 else 0
case "]":
LARG_MAX += 5
case "[":
LARG_MAX -= 5 if LARG_MAX > LARG_MIN else 0
case "w":
PASSO += 1
case "s":
PASSO -= 1 if PASSO > 1 else 0
case "a":
TRACO += 1
case "d":
TRACO -= 1 if TRACO > 1 else 0
case "t":
TRACO_PASSO *= 1.1
case "g":
TRACO_PASSO *= 0.9
def save_and_close():
py5.no_loop()
canvas.save_sketch_image(sketch)
py5.exit_sketch()
if __name__ == "__main__":
py5.run_sketch()