본문으로 건너뛰기
🛠️ToolsShed

리사주 곡선 생성기

인터랙티브 주파수·위상 컨트롤로 리사주 도형을 애니메이션합니다.

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.