Formas Geométricas 01

2026-07-20

"""2026-07-20
Formas Geométricas 01
Exercício de grade de formas geométricas
ericof.com|https://ericof.com/en/sketches/2024-06-29
png
Sketch,py5,CreativeCoding
"""

from random import shuffle
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.draw.grade import cria_grade_ex
from sketches.utils.helpers import sketches as helpers

import py5


sketch = helpers.info_for_sketch(__file__, __doc__)

cor_fundo = py5.color(0)

celula_x: int = 45
celula_y: int = 20
forma_escala: float = 1.11
alternada: bool = True
preencher: bool = True

traco: float = 4.2
cor_traco_preenchido = py5.color(0, 0, 0, 0.2)
traco_preenchido: float = 1.5


def inicializa():
    global formas, grade
    grade = cria_grade_ex(
        *helpers.DIMENSOES.external, 0, 0, celula_x, celula_y, alternada=alternada
    )
    formas = [
        gera_poligono_regular(8, celula_x * forma_escala, celula_y * forma_escala),
        gera_poligono_regular(6, celula_x * forma_escala, celula_y * forma_escala),
        gera_poligono_regular(8, celula_x * forma_escala, celula_y * forma_escala),
        gera_poligono_regular(6, celula_x * forma_escala, celula_y * forma_escala),
        gera_poligono_regular(6, celula_x * forma_escala, celula_y * forma_escala),
        gera_poligono_regular(8, celula_x * forma_escala, celula_y * forma_escala),
    ]
    shuffle(formas)
    shuffle(grade)


def setup():
    global formas, grade
    py5.size(*helpers.DIMENSOES.external, py5.P3D)
    py5.shape_mode(py5.CENTER)
    inicializa()


def draw():
    py5.background(cor_fundo)
    paleta = gera_paleta("op-2363803", True)
    total_formas = len(formas)
    with py5.push():
        py5.translate(0, 0, -10)
        for idx, x, idy, y in grade:
            index = (idx + idy) % total_formas
            forma = formas[index]
            if preencher:
                forma.set_fill(paleta[0])
                forma.set_stroke_weight(traco_preenchido)
                forma.set_stroke(cor_traco_preenchido)
            else:
                forma.set_fill(False)
                forma.set_stroke(paleta[0])
                forma.set_stroke_weight(traco)
            py5.shape(forma, x, y)
            paleta.rotate(1)

    # Credits and go
    canvas.sketch_frame(
        sketch,
        cor_fundo,
        "large_transparent_white",
        "transparent_white",
        version=2,
    )


def key_pressed():
    key = py5.key
    if key == " ":
        save_and_close()
    elif key == "r":
        inicializa()


def save_and_close():
    py5.no_loop()
    canvas.save_sketch_image(sketch)
    py5.exit_sketch()


if __name__ == "__main__":
    py5.run_sketch()