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!


Curvas Lissajous

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 é:

  • x(t)=Asin(at+δ)x(t) = A \cdot \sin(a \cdot t + \delta)

  • y(t)=Bsin(bt)y(t) = B \cdot \sin(b \cdot t)

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:


pip install matplotlib


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

import numpy as np
import matplotlib.pyplot as plt import time
  • 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


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 (90°) pontos = 1000 # Número de pontos calculados velocidade = 0.005 # Pausa entre cada atualização (em segundos)

Esses valores definem o formato da curva e a velocidade de exibição.


Geração dos pontos da curva


t = np.linspace(0, 2 * np.pi, pontos) x = A * np.sin(a * t + delta) y = B * np.sin(b * t)
  • linspace: cria pontos valores de t uniformemente espaçados de 0 a .

  • x e y: valores calculados com base nas fórmulas da Curva de Lissajous.


Configuração da Janela de Plotagem


plt.ion() fig, ax = plt.subplots() fig.patch.set_facecolor('#0a0a0a') # Fundo da janela ax.set_facecolor('#111111') # Fundo do gráfico 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')
  • 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


line, = ax.plot([], [], color='cyan', linewidth=1.5, label='Trajetória') ax.legend(loc='upper right', facecolor='#222', edgecolor='white', labelcolor='cyan')
  • Cria um gráfico inicialmente vazio ([]).

  • Define a cor, espessura da linha e legenda com estilo dark.


Loop de atualização em tempo real


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)
  • 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() plt.show()
  • 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:


nano lissajous.py

Cole o código e salve com CTRL+O, ENTER, e saia com CTRL+X.

2. Crie um script .sh para executar facilmente:


nano run_lissajous.sh

E adicione:


#!/bin/bash python3 lissajous.py

Dê permissão de execução:


chmod +x run_lissajous.sh

Agora você pode rodar com:


./run_lissajous.sh

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"


a = 3 b = 2 delta = np.pi / 3

Exemplo 2: Formato de "nó"


a = 5 b = 5 delta = np.pi / 2

Exemplo 3: Elipse rotacionada


a = 1 b = 1 delta = np.pi / 4

Dica: Quanto maior a razão entre a e b, mais complexa será a figura. Tente:


a = 9 b = 8

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!



Veja também: