Grades Sobrepostas

2024-05-23

"""2024-05-23
Grades Sobrepostas
Criação de duas grades, de diferentes tamanhos
png
Sketch,py5,CreativeCoding
"""

from random import choice

import py5

from utils import helpers

sketch = helpers.info_for_sketch(__file__, __doc__)

GRADE = []
GRADE_FUNDO = []
QUADRADO = 80
QUADRADO_FUNDO = 90


CORES = [
    (0, 0, 0),
    (127, 143, 110),
    (179, 176, 133),
    (200, 200, 200),
    (212, 198, 170),
    (218, 211, 189),
    (90, 119, 168),
    (187, 137, 30),
    (30, 30, 30),
    (40, 50, 60),
]


POS = [
    (0, 0),
    (0, QUADRADO),
    (QUADRADO / 2, QUADRADO / 2),
    (QUADRADO / 2, 0),
    (0, QUADRADO / 2),
    (QUADRADO / 2, QUADRADO),
    (QUADRADO, QUADRADO / 2),
    (QUADRADO / 2, QUADRADO / 3),
    (QUADRADO, QUADRADO),
    (QUADRADO, 0),
]


def setup():
    py5.size(helpers.LARGURA, helpers.ALTURA, py5.P3D)
    grades = [
        [-200, 200, 100, (240, 233, 211), GRADE, QUADRADO],
        [-350, 350, 100, (120, 117, 106), GRADE_FUNDO, QUADRADO_FUNDO],
    ]
    for inicio, final, passo_grade, fundo, grade, t_quadrado in grades:
        for idy, y in enumerate(range(inicio, final, passo_grade), 1):
            for idx, x in enumerate(range(inicio, final, passo_grade), 1):
                pg = py5.create_graphics(t_quadrado, t_quadrado)
                num_circulos = py5.random_int(3, 5)
                circulos = []
                for _ in range(num_circulos):
                    pos = choice(POS)
                    tamanho = py5.random_int(5, 50)
                    passo = py5.TWO_PI / py5.random_int(2, 22)
                    cor = choice(CORES)
                    circulos.append((pos, tamanho, cor))
                grade.append(
                    (pg, (x, y), (idx, idy), fundo, passo, circulos, t_quadrado)
                )


def draw():
    py5.background(248, 241, 219)
    f = py5.frame_count
    i = 0
    with py5.push_matrix():
        py5.translate(py5.width / 2, py5.height / 2)
        for rot, grade in [(0, GRADE_FUNDO), (45, GRADE)]:
            py5.rotate(py5.radians(rot))
            for pg, (x, y), (idx, idy), fundo, passo, circulos, t_quadrado in grade:
                pg.begin_draw()
                pg.background(*fundo)
                for circulo in circulos:
                    (xc, yc), d, cor = circulo
                    s = py5.cos(py5.radians(f * 2) + i * passo)
                    d += 50 * s
                    pg.fill(*cor)
                    pg.circle(xc, yc, d)
                pg.end_draw()
                with py5.push_style():
                    py5.stroke("#000")
                    py5.stroke_weight(3)
                    py5.square(x - 1, y - 1, t_quadrado + 2)
                py5.image(pg, x, y)
                i += 1
    helpers.write_legend(sketch=sketch, frame="#000")


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


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


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