Lissajous Curve Generator
Anima ed esplora le figure di Lissajous con controlli interattivi di frequenza e fase.
Formula
Informazioni sullo strumento
Una curva di Lissajous è una figura matematica prodotta combinando due oscillazioni perpendicolari con frequenze diverse. Prendendo il nome dal fisico francese Jules Antoine Lissajous, queste eleganti curve parametriche hanno affascinato matematici e ingegneri per oltre 160 anni. La bellezza delle figure di Lissajous risiede nella loro semplicità—solo due onde sinusoidali creano motivi intricati e simmetrici che vanno dalle semplici ellissi alle forme complesse simili a nodi.
Utilizzando questo generatore, puoi sperimentare interattivamente con rapporti di frequenza e differenze di fase per vedere come modellano la curva finale. Regola le frequenze A e B indipendentemente, controlla con precisione lo sfasamento δ, modifica l'ampiezza della curva e personalizza la visualizzazione con colori e lunghezza della traccia. Riproducendo l'animazione, osserverai come la fase evolve continuamente, trasformando la figura attraverso tutte le sue forme possibili—un modo tangibile per comprendere relazioni armoniche e fenomeni di risonanza.
Le curve di Lissajous sono molto più che decorative: compaiono nei display degli oscilloscopi nei laboratori di ingegneria elettrica, illustrano il movimento dei pendoli accoppiati nelle classi di fisica, visualizzano relazioni di frequenza nell'ingegneria audio e informano la progettazione di antenne. Che tu sia uno studente che esplora curve parametriche, un ingegnere che esegue il debug delle relazioni di segnale, o semplicemente qualcuno affascinato dalla bellezza matematica, questo strumento rende il concreto l'astratto.
Domande Frequenti
Implementazione del Codice
import math
def lissajous_points(freq_a: float, freq_b: float, delta: float,
amplitude: float = 1.0, num_points: int = 1000) -> list[tuple[float, float]]:
"""Generate Lissajous curve points.
x(t) = A * sin(a*t + delta)
y(t) = A * sin(b*t)
"""
points = []
for i in range(num_points):
t = 2 * math.pi * i / num_points
x = amplitude * math.sin(freq_a * t + delta)
y = amplitude * math.sin(freq_b * t)
points.append((x, y))
return points
# Common interesting ratios
ratios = [
(1, 1, math.pi / 4, "Ellipse (a:b=1:1)"),
(1, 2, math.pi / 4, "Figure-8 (a:b=1:2)"),
(2, 3, math.pi / 4, "Bow-tie (a:b=2:3)"),
(3, 4, math.pi / 4, "Complex knot (a:b=3:4)"),
(5, 4, 0, "Star pattern (a:b=5:4)"),
]
for a, b, delta, label in ratios:
pts = lissajous_points(a, b, delta)
x_vals = [p[0] for p in pts]
y_vals = [p[1] for p in pts]
print(f"{label}: x range [{min(x_vals):.3f}, {max(x_vals):.3f}]")
# Number of lobes = |a - b| or related to ratio
# Closed curve when a/b is rational
def is_closed(a: float, b: float) -> bool:
from math import gcd
if isinstance(a, int) and isinstance(b, int):
g = gcd(a, b)
return True # rational ratio
return False
print(f"\na=3, b=4 closed curve: {is_closed(3, 4)}")Comments & Feedback
Comments are powered by Giscus. Sign in with GitHub to leave a comment.