跳到内容
🛠️ToolsShed

Lissajous Curve Generator

用交互式频率和相位控制对李萨如图形进行动画和探索。

3
2
45°
180px
500

公式

x(t) = A · sin(3t + δ)
y(t) = B · sin(2t)
δ = 45° = 0.25π
Ratio: 3:2

关于此工具

利萨如曲线是通过组合两个具有不同频率的垂直振动而产生的数学图形。这些优雅的参数曲线以法国物理学家朱尔·安托万·利萨如的名字命名,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.