Esfera de Conexões 01

2025-12-25

"""2025-12-25
Esfera de Conexões 01
Inspirado em sketch de Naoki Tsutae
ericof.com|https://openprocessing.org/sketch/2775641
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__)


NUM_PONTOS = 360
RAIO = 350
cor_fundo = py5.color(0)

pontos = []
cantos = []
paleta = []


def popula_cantos():
    total_pontos = len(pontos)
    for i in range(total_pontos):
        for j in range(i + 1, total_pontos):
            a = pontos[i]
            b = pontos[j]
            mid = (a + b) * 0.5
            radius_sq = (a - mid).mag_sq
            # Valida se há outros pontos dentro da esfera definida por a e b
            ok = True
            for k in range(len(pontos)):
                if k in (i, j):
                    continue
                dist_sq = (pontos[k] - mid).mag_sq
                if dist_sq < radius_sq:
                    ok = False
                    break
            if ok:
                cantos.append((a, b))
    base = gera_paleta("bright-colors", True)
    for _ in range(len(cantos)):
        cor = base[0]
        paleta.append(cor)
        base.rotate(1)


def setup():
    py5.size(*helpers.DIMENSOES.external, py5.P3D)
    py5.background(cor_fundo)
    # Popula pontos aleatórios
    for _ in range(NUM_PONTOS):
        p = py5.Py5Vector3D.random() * RAIO
        pontos.append(p)
    popula_cantos()


def draw():
    frame_count = py5.frame_count
    with py5.push():
        py5.translate(py5.width / 2, py5.height / 2)
        py5.background(cor_fundo)
        py5.rotate_y(frame_count * -0.001)
        for i, (a, b) in enumerate(cantos):
            cor = paleta[i]
            py5.stroke(cor)
            py5.stroke_weight((i % 5) + 1)
            py5.line(a.x, a.y, a.z, b.x, b.y, b.z)

    # Credits and go
    canvas.sketch_frame(
        sketch, cor_fundo, "large_transparent_white", "transparent_white"
    )


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


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


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