リサジュー曲線ジェネレーター
インタラクティブな周波数・位相コントロールでリサジュー図形をアニメーション表示します。
3
2
45°
180px
500
公式
x(t) = A · sin(3t + δ)
y(t) = B · sin(2t)
δ = 45° = 0.25π
Ratio: 3:2
このツールについて
リサジュー曲線は、異なる周波数を持つ二つの垂直な振動を組み合わせることで生成される数学的な図形です。フランスの物理学者ジュール・アントワーヌ・リサジューにちなんで名付けられたこれらの優雅な媒介変数曲線は、160年以上にわたって数学者や工学者を魅了し続けています。リサジュー図形の美しさはその単純性にあります—わずか2つの正弦波が、単純な楕円から複雑な結び目状の形まで、精巧で対称的なパターンを生成するのです。
このジェネレータを使用すると、周波数比と位相差を対話的に実験して、最終的な曲線の形状がどのように決まるかを観察できます。周波数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.