Skip to main content

6. 진동의 진폭과 주기

  • 다음 그림은 사인 함수 그래프입니다.
  • y=sin(x)y=\sin(x)
  • 사인 함수 그래프는 -1과 1을 왔다갔다 진동(Oscellation) 하는 곡선입니다.
  • 기타 줄을 튕겼을 때 현의 움직임, 추의 움직임, 물결치는 수면 모두 진동입니다.

단순 조화 운동

  • 원이 왼쪽과 오른쪽 끝을 왔다갔다 진동하는 단순 조화 운동(simple harmonic motion) 을 그려보죠.
  • 위 그림은 x축을 기반으로 움직이고 있습니다.

진폭과 주기

  • 단순 조화 운동은 2가지 요소로 표현할 수 있습니다.
    • 진폭(amplitude): 움직임의 중심과 가장 멀리 이동했을 때의 거리
    • 주기(period): 1번 완전히 진동하는 데 걸리는 시간
  • 사인 함수 그래프를 보면, 진폭은 1이고, 주기는 2π2\pi 라디안 입니다.
  • p5에서 진폭은 픽셀로 나타낼 수 있습니다. 아래 코드에 따르면, 화면 너비가 200px이라면 중앙에서부터 양쪽으로 100px씩 움직입니다.
    let amplitude = 100;
  • p5에서 시간 단위는 애니메이션의 시간 단위인 프레임 수(frameCount)입니다. 따라서 주기는 프레임으로 나타낼 수 있습니다.
    let period = 120;
  • 진폭과 주기를 정했다면 공식을 이용해 x의 위치를 구할 수 있습니다.
    let x = amplitude * sin(TWO_PI * (frameCount / period));
    frameCountframeCount / periodTWO_PI * frameCount / period
    000
    600.5π\pi
    12012π2\pi
    24024π4\pi
    .........
  • frameCount / period는 몇 번 진동했는지를 나타냅니다. 0.5라면 0.5번, 1이라면 1번 진동한 상태입니다.
  • TWO_PI는 삼각함수가 1번 진동하는 데 필요한 라디안 값입니다.
  • 따라서 몇 번 진동했는지와 TWO_PI를 곱하면 x를 구할 수 있습니다.

예제 코드 3.5 단순 조화 운동 1

  • 아래 코드는 원이 x 방향으로 100px의 진폭, 120프레임의 주기로 진동합니다.
function setup() {
createCanvas(640, 240);
}

function draw() {
background(255);
translate(width / 2, height / 2);

// 진폭과 주기
let amplitude = 200;
let period = 120;

// 수평 위치 계산
let x = amplitude * sin((TWO_PI * frameCount) / period);

strokeWeight(2);
fill(127);
line(0, 0, x, 0);
circle(x, 0, 40);
}

진동수

  • 진동수(frequency) 는 단위 시간마다 진동한 횟수입니다.
  • 공식으로는 1 / period 로 위 예제의 진동수는 1/120입니다.
  • 즉, 1프레임에 1/120만큼 진동한다는 뜻입니다.
연습 문제 3.7

사인 함수를 사용해 상단에서 스프링으로 매달린 추(bob이라고도 함)의 시뮬레이션을 만들어 봅시다. map() 을 사용하여 추의 수직 위치를 계산합니다.

추후 [Spring Forces]에서는 후크 법칙에 따라 스프링의 힘을 모델링해 동일한 시뮬레이션을 만드는 방법을 보여주겠습니다.