Cubo

2023-05-24

"""2023-05-24"""
from helpers import HEIGHT
from helpers import save_frame
from helpers import save_gif
from helpers import tmp_path
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", "")
PATH = tmp_path()

FRAMES = []

PONTOS = []


def gera_cor():
    return py5.color(
        py5.random_int(0, 100),
        py5.random_int(40, 100),
        py5.random_int(90, 100),
    )


def gera_pontos(points: int):
    rng = np.random.default_rng()
    x1 = WIDTH / 2
    y1 = HEIGHT / 2
    z1 = 800 / 2
    x0 = -x1
    y0 = -y1
    z0 = -z1
    raw = rng.uniform([x0, y0, z0], [x1, y1, z1], size=(points, 3))
    return [[x, y, z, py5.random_int(1, 6), gera_cor()] for x, y, z in raw]


def setup():
    py5.size(WIDTH, HEIGHT, py5.P3D)
    py5.color_mode(py5.HSB, 100, 100, 100)
    p = 35000
    py5.frame_rate(15)
    PONTOS.extend(gera_pontos(p))


def draw():
    frame = py5.frame_count
    passo = frame % 360
    py5.background(0)
    write_legend([py5.color(100)], img_name=IMG_NAME)
    with py5.push_matrix():
        py5.translate(WIDTH / 2, HEIGHT / 2, -700)
        py5.rotate_x(py5.radians(passo))
        py5.rotate_y(py5.radians(passo))
        for x, y, z, weight, color in PONTOS:
            py5.stroke_weight(weight)
            py5.stroke(color)
            py5.point(x, y, z)
    if frame % 4 == 1:
        FRAMES.append(save_frame(PATH, IMG_NAME, frame))
    if len(FRAMES) > 45:
        print("Too many frames")
        py5.no_loop()
    py5.window_title(f"FR: {py5.get_frame_rate():.1f} | Frame Count: {frame} {passo}")


def key_pressed():
    key = py5.key
    if key == " ":
        py5.no_loop()
        save_gif(IMG_NAME, FRAMES, duration=100)
        py5.exit_sketch()


py5.run_sketch()