Calçada Bilbao 2

2023-10-10

"""2023-10-10"""
from helpers import CelulaV4 as Celula
from helpers import Grade
from helpers import HEIGHT
from helpers import save_image
from helpers import WIDTH
from helpers import write_legend
from pathlib import Path

import py5


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

CORES = [
    py5.color(240),
]

LADO = 50

FATOR = 0.6
FATOR_LARGURA_INTERNA = 0.85


def forma_01():
    limite = LADO * FATOR
    bz1 = LADO * FATOR
    s = py5.create_shape()
    with s.begin_shape():
        s.vertex(0, 0)
        s.vertex(0, LADO)
        s.vertex(limite, LADO)
        s.bezier_vertex(limite, LADO, bz1, bz1, LADO, limite)
        s.vertex(LADO, limite)
        s.vertex(LADO, 0)
        s.vertex(0, 0)
    return s


def forma_02():
    limite = LADO * FATOR
    bz1 = LADO * FATOR
    bz2 = (LADO - limite) * FATOR
    s = py5.create_shape()
    with s.begin_shape():
        s.vertex(0, 0)
        s.vertex(0, limite)
        s.bezier_vertex(0, limite, bz2, bz1, LADO - limite, LADO)
        s.vertex(LADO - limite, LADO)
        s.vertex(limite, LADO)
        s.bezier_vertex(limite, LADO, bz1, bz1, LADO, limite)
        s.vertex(LADO, 0)
        s.vertex(0, 0)
    return s


def forma_03():
    limite = LADO * FATOR
    bz1 = LADO * FATOR
    bz2 = (LADO - limite) * FATOR
    s = py5.create_shape()
    with s.begin_shape():
        s.vertex(0, 0)
        s.vertex(0, LADO)
        s.vertex(limite, LADO)
        s.bezier_vertex(limite, LADO, bz1, bz1, LADO, limite)
        s.vertex(LADO, limite)
        s.vertex(LADO, LADO - limite)
        s.bezier_vertex(LADO, LADO - limite, bz1, bz2, limite, 0)
        s.vertex(limite, 0)
        s.vertex(0, 0)
    return s


def circulo(s, inicio, meio, fim):
    s.vertex(inicio, meio)
    s.bezier_vertex(inicio, meio, inicio, inicio, meio, inicio)
    s.vertex(meio, inicio)
    s.bezier_vertex(meio, inicio, fim, inicio, fim, meio)
    s.vertex(fim, meio)
    s.bezier_vertex(fim, meio, fim, fim, meio, fim)
    s.vertex(meio, fim)
    s.bezier_vertex(meio, fim, inicio, fim, inicio, meio)
    s.vertex(inicio, meio)


def forma_centro():
    inicio = 0
    fim = LADO
    meio = fim // 2
    s = py5.create_shape()
    with s.begin_shape():
        circulo(s, inicio, meio, fim)
        with s.begin_contour():
            inicio = 6
            fim = LADO - inicio
            meio = (fim - inicio) // 2
            circulo(s, inicio, meio, fim)

    return s


def _factory(pontos):
    s = py5.create_shape()
    with s.begin_shape():
        for x, y in pontos:
            s.vertex(x, y)
    return s


def setup():
    py5.size(WIDTH, HEIGHT, py5.P3D)
    py5.background(py5.color(120))
    formas = [forma_01(), forma_02(), forma_03(), forma_centro()]
    linhas = 9
    colunas = 9
    margem = -100
    bloco = 3
    largura = (py5.width - (2 * margem)) / colunas
    grade = Grade(0, 0, WIDTH, HEIGHT, colunas, linhas, margem, margem)
    for idx, slot in enumerate(grade):
        linha = idx // colunas
        coluna = idx % colunas
        coluna_interna = coluna % bloco
        linha_interna = linha % bloco
        forma = formas[1] if (linha_interna + coluna_interna) % 2 else formas[0]
        largura_interna = largura * FATOR_LARGURA_INTERNA
        x, y, largura_celula = slot.x, slot.y, largura
        if linha_interna == 1:
            # Linha do meio
            forma = formas[2]
            if coluna_interna == 1:
                largura_interna = largura
                forma = formas[3]
        celula = Celula(
            x,
            y,
            largura_celula,
            [forma],
            CORES,
            border=0,
        )
        celula.largura_interna = largura_interna
        celula.espelhada = coluna_interna == 2
        celula.espelhada_vertical = linha_interna == 2
        if linha_interna == coluna_interna == 1:
            celula.fill = True
            celula.largura_interna = largura

        slot.celulas.append(celula)
    with py5.push_matrix():
        py5.translate(WIDTH // 2, HEIGHT // 2)
        py5.rotate(py5.radians(45))
        py5.translate(-(WIDTH // 2), -(HEIGHT // 2))
        grade.desenha()
        write_legend([py5.color(0, 0, 0)], IMG_NAME)


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


def save_and_close():
    py5.no_loop()
    save_image(IMG_NAME, "png")
    py5.exit_sketch()


py5.run_sketch()