Lissajous Curve Generator
Анимируйте и исследуйте фигуры Лиссажу с интерактивными элементами управления частотой и фазой.
Формула
Об этом инструменте
Кривая Лиссажу—это математическая фигура, получаемая путём комбинирования двух перпендикулярных колебаний с разными частотами. Названные в честь французского физика Жюля Антуана Лиссажу, эти элегантные параметрические кривые более 160 лет очаровывают математиков и инженеров. Красота фигур Лиссажу заключается в их простоте—всего лишь две синусоидальные волны создают сложные и симметричные узоры, от простых эллипсов до сложных узловидных форм.
Используя этот генератор, вы можете интерактивно экспериментировать с соотношениями частот и разностями фаз, наблюдая, как они формируют итоговую кривую. Регулируйте частоты A и B независимо, точно управляйте сдвигом фазы δ, изменяйте амплитуду кривой и настраивайте визуализацию с помощью цветов и длины хвоста. Воспроизводя анимацию, вы увидите, как фаза непрерывно эволюционирует, трансформируя фигуру через все её возможные формы—осязаемый способ понять гармонические отношения и явления резонанса.
Кривые Лиссажу—это намного больше, чем просто украшение: они появляются на дисплеях осциллографов в лабораториях электротехники, демонстрируют движение связанных маятников на уроках физики, визуализируют частотные соотношения в звукорежиссуре и информируют проектирование антенн. Будь вы студентом, исследующим параметрические кривые, инженером, отлаживающим соотношения сигналов, или просто человеком, очарованным математической красотой, этот инструмент делает абстрактное конкретным.
Часто задаваемые вопросы
Реализация кода
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.