MSX Basic: Código de Barras 01

2025-10-14

"""2025-10-14
MSX Basic: Código de Barras 01
Desenho com barras simulando um código baseado em código MSX Basic.
ericof.com|https://github.com/gilbertfrancois/msx/blob/master/src/basic/barcode.bas
png
Sketch,py5,CreativeCoding
"""

from sketches.utils.draw import canvas
from sketches.utils.draw.cores.paletas import gera_paleta
from sketches.utils.helpers import sketches as helpers

import py5


sketch = helpers.info_for_sketch(__file__, __doc__)

A = (py5.random() - 1) * 0.6
W = 0
LARGURA = 800
ALTURA = 800
PASSO_Y = 10
PASSO_X = 1


def barras():
    paleta = gera_paleta("Warhol", True)
    metade_l = LARGURA // 2
    metade_a = ALTURA // 2
    for y0 in range(-metade_a, metade_a + 1, PASSO_Y):
        for x0 in range(-metade_l, metade_l + 1, PASSO_X):
            yv = (
                y0
                / metade_a
                * 18
                * py5.cos(py5.radians(-A + x0 / LARGURA * 9))
                * (py5.sin(py5.radians(y0 / metade_a * 7)))
            )
            y1 = y0 + yv + x0 * A
            py5.stroke(paleta[0])
            py5.point(x0, y1)
            PR = py5.random(10)
            c1 = paleta[1] if PR > 5.0 else paleta[0]
            py5.stroke(c1)
            py5.line(x0, y1 + 1, x0, metade_a)
        paleta.rotate()


def setup():
    py5.size(*helpers.DIMENSOES.external, py5.P3D)
    py5.color_mode(py5.HSB, 360, 100, 100)


def draw():
    cor_fundo = py5.color(0)
    py5.background(cor_fundo)
    with py5.push():
        py5.translate(*helpers.DIMENSOES.centro, -100)
        barras()
    parametros = f"Params: {LARGURA} - {ALTURA} - {PASSO_X} - {PASSO_Y}"
    py5.window_title(parametros)
    # Credits and go
    canvas.sketch_frame(
        sketch, cor_fundo, "large_transparent_white", "transparent_white"
    )
    with py5.push():
        py5.translate(0, 0, 10)
        canvas.draw_text_box(
            parametros, style_name="transparent_white", x=20, y=950, align=py5.LEFT
        )


def key_pressed():
    global LARGURA, ALTURA, PASSO_X, PASSO_Y
    key = py5.key
    match key:
        case " ":
            save_and_close()
        case "+":
            LARGURA += 5
        case "-":
            LARGURA -= 5 if LARGURA > 5 else 0
        case ">":
            ALTURA += 5
        case "<":
            ALTURA -= 5 if ALTURA > 2 else 0
        case "w":
            PASSO_Y += 1
        case "s":
            PASSO_Y -= 1 if PASSO_Y > 1 else 0
        case "d":
            PASSO_X += 2
        case "a":
            PASSO_X -= 2 if PASSO_X > 1 else 0


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


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