Desenhando Curvas de Lissajous com Python: Um Show Visual em Tempo Real
Você já ouviu falar das curvas de Lissajous? Esses belos padrões geométricos, que parecem dançar na tela, são formados por funções senoides e possuem aplicações na física, eletrônica e até na arte generativa. Neste artigo, vamos te mostrar como desenhar uma curva de Lissajous com Python de forma visual e em tempo real, ideal para demonstrações ou para simplesmente se encantar com a matemática viva!
O que é uma Curva de Lissajous?
As Curvas de Lissajous representam o movimento resultante de duas oscilações senoidais perpendiculares, uma no eixo X e outra no eixo Y.
A fórmula paramétrica é:
Onde:
-
A e B são amplitudes (alargamento do gráfico).
-
a e b são frequências (número de oscilações).
-
δ (delta) é o deslocamento de fase entre os dois movimentos.
-
t é o parâmetro de tempo.
📦 Pré-requisitos
Antes de rodar o script, certifique-se de instalar o pacote necessário:
Código Completo com Visualização em Tempo Real
Aqui está um exemplo completo e didático em Python para desenhar uma curva de Lissajous com efeitos visuais em tempo real:
import numpy as np
import matplotlib.pyplot as plt
import time
# ==== CONFIGURAÇÕES DO USUÁRIO ====
A = 1 # Amplitude no eixo X
B = 1 # Amplitude no eixo Y
a = 5 # Frequência no eixo X
b = 4 # Frequência no eixo Y
delta = np.pi / 2 # Diferença de fase
pontos = 1000 # Quantidade de pontos
velocidade = 0.005 # Tempo entre cada ponto (em segundos)
# ==================================
t = np.linspace(0, 2 * np.pi, pontos)
x = A * np.sin(a * t + delta)
y = B * np.sin(b * t)
plt.ion()
fig, ax = plt.subplots()
fig.patch.set_facecolor('#0a0a0a')
ax.set_facecolor('#111111')
ax.set_title('Curva de Lissajous em tempo real', color='cyan', fontsize=14)
ax.set_xlim(-1.2, 1.2)
ax.set_ylim(-1.2, 1.2)
ax.set_aspect('equal')
ax.grid(True, color='gray', linestyle='--', linewidth=0.5)
ax.tick_params(colors='white')
line, = ax.plot([], [], color='cyan', linewidth=1.5, label='Trajetória')
ax.legend(loc='upper right', facecolor='#222', edgecolor='white', labelcolor='cyan')
xdata, ydata = [], []
for i in range(len(t)):
xdata.append(x[i])
ydata.append(y[i])
line.set_data(xdata, ydata)
plt.draw()
plt.pause(velocidade)
plt.ioff()
plt.show()
Explicação Linha a Linha
-
numpy
: usado para cálculos matemáticos e geração de pontos (vetores).
-
matplotlib.pyplot
: para plotar o gráfico.
-
time
: usado para controle da pausa entre frames, se necessário (aqui é opcional pois usamos plt.pause()
).
numpy
: usado para cálculos matemáticos e geração de pontos (vetores).
matplotlib.pyplot
: para plotar o gráfico.
time
: usado para controle da pausa entre frames, se necessário (aqui é opcional pois usamos plt.pause()
).
Parâmetros de Configuração
Esses valores definem o formato da curva e a velocidade de exibição.
Geração dos pontos da curva
-
linspace
: cria pontos
valores de t
uniformemente espaçados de 0
a 2π
.
-
x
e y
: valores calculados com base nas fórmulas da Curva de Lissajous.
linspace
: cria pontos
valores de t
uniformemente espaçados de 0
a 2π
.
x
e y
: valores calculados com base nas fórmulas da Curva de Lissajous.
Configuração da Janela de Plotagem
-
plt.ion()
: ativa o modo interativo, necessário para atualizar o gráfico em tempo real.
-
set_aspect('equal')
: garante que as proporções dos eixos sejam iguais (senão a curva pode parecer deformada).
-
Cores e grid são personalizadas para um visual mais dark e moderno.
plt.ion()
: ativa o modo interativo, necessário para atualizar o gráfico em tempo real.
set_aspect('equal')
: garante que as proporções dos eixos sejam iguais (senão a curva pode parecer deformada).
Cores e grid são personalizadas para um visual mais dark e moderno.
Inicializa o gráfico da curva
-
Cria um gráfico inicialmente vazio ([]
).
-
Define a cor, espessura da linha e legenda com estilo dark.
Cria um gráfico inicialmente vazio ([]
).
Define a cor, espessura da linha e legenda com estilo dark.
Loop de atualização em tempo real
-
O loop percorre cada ponto i
.
-
Os valores de x[i]
e y[i]
são adicionados ao caminho.
-
set_data
atualiza o gráfico com os novos pontos.
-
plt.pause(velocidade)
dá uma pequena pausa, gerando a animação fluida.
O loop percorre cada ponto i
.
Os valores de x[i]
e y[i]
são adicionados ao caminho.
set_data
atualiza o gráfico com os novos pontos.
plt.pause(velocidade)
dá uma pequena pausa, gerando a animação fluida.
Finaliza o modo interativo e exibe o gráfico final
-
plt.ioff()
: desliga o modo interativo após a animação.
-
plt.show()
: exibe o gráfico final completo e estático.
plt.ioff()
: desliga o modo interativo após a animação.
plt.show()
: exibe o gráfico final completo e estático.
Como Executar o Programa
1. Salve o código em um arquivo .py
, por exemplo:
Cole o código e salve com CTRL+O
, ENTER
, e saia com CTRL+X
.
2. Crie um script .sh
para executar facilmente:
E adicione:
Dê permissão de execução:
Agora você pode rodar com:
Experimentos com Parâmetros
A beleza das curvas de Lissajous está na possibilidade de gerar formas muito diferentes com pequenas mudanças nos parâmetros:
Exemplo 1: Forma tipo "borboleta"
Exemplo 2: Formato de "nó"
Exemplo 3: Elipse rotacionada
Dica: Quanto maior a razão entre a
e b
, mais complexa será a figura. Tente:
Conclusão
Com este projeto, você aprendeu:
-
O que são as curvas de Lissajous e como surgem.
-
Como visualizá-las com Python e Matplotlib.
-
Como tornar o gráfico interativo e visualmente agradável.
-
Como rodar o programa facilmente via terminal.
Este código cria uma visualização dinâmica e estilizada de uma Curva de Lissajous com:
Parâmetros personalizáveis.
Efeitos em tempo real com
matplotlib
.Visual moderno com esquema de cores dark.
Explore combinações, incremente com sliders ou até gere GIFs dessas figuras fascinantes. A matemática também pode ser arte.
Se quiser, posso te mostrar como adicionar interface gráfica, música sincronizada, ou exportar os frames como vídeo. Me avise!
Curvas de Lissajous são uma maneira linda de visualizar a harmonia matemática e explorar os fundamentos das ondas. Com Python, é possível trazer esse conceito à vida em poucos minutos, criando gráficos interativos que encantam e educam ao mesmo tempo.
Deixe seu comentário abaixo, e junte-se à nossa comunidade para criar, aprender e se divertir com código.
No NoirCode, o futuro é digital, e você já faz parte dele!