Ladrilhos Compostos 6

2023-07-19

"""2023-07-19"""
from helpers import HEIGHT
from helpers import save_image
from helpers import WIDTH
from helpers import write_legend
from pathlib import Path

import numpy as np
import py5

IMG_NAME = Path(__file__).name.replace(".py", "")

PONTOS = []

POL_1 = None
POL_2 = None


def calcula_circulo(diametro):
    pontos = []
    raio = diametro // 2
    n = 360
    for ponto in range(0, n + 1):
        x = np.cos(2 * py5.PI / n * ponto) * raio
        y = np.sin(2 * py5.PI / n * ponto) * raio
        pontos.append((int(x), int(y)))
    return pontos


def sorteia_cores():
    h1 = 270
    h2 = 90
    s = py5.random(22, 90)
    b = py5.random(50, 75)
    return (py5.color(h2, s, b), py5.color(h1, s, b + 10))


def poligono(circulo, lados=3):
    angle = 360 / lados
    s = py5.create_shape()
    with s.begin_closed_shape():
        for i in range(0, lados + 1):
            if (idx := int(i * angle)) > 360:
                idx = idx % 360
            x, y = circulo[idx]
            s.vertex(x, y)
    return s


def setup():
    global POL_1, POL_2
    py5.size(WIDTH, HEIGHT, py5.P3D)
    py5.color_mode(py5.HSB, 360, 100, 100)
    buffer = 1
    largura = HEIGHT // 10
    linhas = HEIGHT + (buffer * largura) // largura
    colunas = HEIGHT + (buffer * largura) // largura
    buffer_linha = 0
    circulo = calcula_circulo(50)
    POL_1 = poligono(circulo, 3)
    POL_2 = poligono(circulo, 6)
    for i in range(linhas):
        y = i * largura - buffer_linha
        buffer_coluna = 0
        for j in range(colunas):
            x = j * largura - buffer_coluna
            PONTOS.append((x, y, largura))
    print(f"Finalizado Setup com {linhas} {colunas}")
    desenha(POL_1, POL_2)


def desenha(forma1, forma2):
    angulo = py5.radians(45)
    forma1.rotate(angulo)
    forma2.rotate(angulo)
    total_pontos = len(PONTOS)
    py5.shape_mode(py5.CENTER)
    with py5.push_matrix():
        py5.translate(WIDTH / 2, HEIGHT / 2)
        py5.rotate(angulo)
        print(f"{total_pontos}")
        for idx, (base_x, base_y, largura) in enumerate(PONTOS):
            if idx % 100 == 0:
                print(f"  - {(idx / total_pontos) * 100}")
            x = base_x - WIDTH
            y = base_y - HEIGHT
            cor1, cor2 = sorteia_cores()
            if idx % 2 == 1:
                cor1, cor2 = cor2, cor1
            # Desenha poligono externo
            forma2.set_fill(cor1)
            py5.shape(forma2, x, y, largura, largura)
            # Desenha poligono interno
            largura_interno = largura * 0.75
            forma1.set_fill(cor2)
            py5.shape(forma1, x, y, largura_interno, largura_interno)
    write_legend(img_name=IMG_NAME)
    save_image(IMG_NAME, "png")


def key_pressed():
    key = py5.key
    if key == " ":
        save_image(IMG_NAME, "png")
        py5.exit_sketch()


py5.run_sketch()