rustingcrab

Tunel psicodélico

Cleuton Sampaio REPO

Legal, né? Cara, esse foi ouvindo Led Zeppelin, Deep Purple e Yes

A matemática

A ideia central é usar geometria polar e funções de onda para montar um túnel que se repete como num caleidoscópio e ainda “pulse” no tempo. Primeiro você cria uma grade de pontos X e Y que variam de –1 a 1, de modo que o meio da tela seja (0,0). Para cada ponto dessa grade, calcula-se:

  1. R, a distância do ponto ao centro, usando a fórmula de círculo $R = \sqrt{X^2 + Y^2}$.
  2. Θ, o ângulo relativo ao eixo X, com $Θ = atan2(Y, X).

Em seguida, “dobra-se” esse ângulo em fatias iguais — se for 16 segmentos, você pega o ângulo original e aplica um módulo para repetir o padrão a cada $2\pi/16$. Ainda faz um valor absoluto para simular o reflexo de um caleidoscópio, como se cada fatia fosse um espelho.

Com o raio e o ângulo dobrado em mãos, gera-se dois padrões de onda:

Você soma esses dois sinais e normaliza de –1…1 para 0…255, obtendo um padrão em escala de cinza. Para fazer as cores, repete a função seno sobre R com deslocamentos de fase (por exemplo +2 e +4 radianos) para os canais verde e azul. Cada pixel vira então um triplete RGB com tonalidades que se alternam no tempo.

O resultado é um mosaico de ondas radiais e angulares, espelhado em triângulos, e animado pelo termo que depende de “tempo”. É essa combinação de coordenadas polares, dobra angular e funções seno com fases diferentes que cria a ilusão de estar viajando por um túnel psicodélico.

A implementação

Este código foi migrado da versão Python para Rust, atualizando do PyGame para o ggez. Vou comentar as diferenças na implementação… Por favor veja o código original em Python para ter uma referência.

Comparando com a implementação em Python

Vamos comparar as implementações em Python (PyGame) e Rust (ggez), mostrando as principais diferenças de arquitetura, desempenho e estilo de código.

1. Inicialização do contexto e janela

2. Geração da malha de coordenadas

3. Cálculo do padrão caleidoscópico

4. Manipulação de buffer e renderização

5. Loop principal e controle de tempo

6. Vantagens e trade‑offs