Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 발사체(Projectile) 클래스 만들기 — 수평 거리·높이·착륙 시간 계산

문제 정의

JavaScript로 Projectile(발사체) 클래스를 작성하는 것이 과제입니다. 이 클래스는 생성될 때 다음 세 가지 값을 인자로 받습니다.

  • 초기 높이 h₀ — 조건: 0 ≤ h₀ < 200
  • 초기 속도 v₀ — 조건: 0 < v₀ < 200
  • 발사 각도 a — 조건: 0° < a < 90° (도 단위)

그리고 클래스에 다음 메서드를 구현해야 합니다.

  • horiz(t) — 시간 t(초)를 인자로 받아 그동안 발사체가 이동한 수평 거리를 계산해 반환합니다. (실수 입력, 실수 반환)

물리적 접근 방법

공기 저항을 무시하면 발사체는 수평 방향으로 등속 직선 운동을 합니다. 따라서 시간 t에서의 수평 거리는 다음 공식으로 구합니다.

x(t) = v₀ × cos(θ) × t

여기서 가장 흔히 저지르는 실수가 바로 각도 단위입니다. JavaScript의 Math.cos()는 라디안(radian)을 기준으로 동작하기 때문에, 도(degree) 단위의 각도를 그대로 넘기면 전혀 다른 값이 나옵니다. 반드시 아래와 같이 변환해야 합니다.

rad = deg × π ÷ 180

클래스 구현

제목에서 다루는 내용에 맞춰 수평 거리뿐 아니라 특정 시점의 높이착륙 시간까지 함께 계산하도록 클래스를 완성해 보겠습니다.

class Projectile {
  constructor(h0, v0, ang) {
    this.h0 = h0;                    // 초기 높이
    this.v0 = v0;                    // 초기 속도
    this.rad = ang * Math.PI / 180;  // 각도를 라디안으로 미리 변환
  }

  // 시간 t에서의 수평 이동 거리
  horiz(t) {
    return this.v0 * Math.cos(this.rad) * t;
  }

  // 시간 t에서의 높이 (중력 가속도 g = 9.81 m/s²)
  height(t) {
    const g = 9.81;
    return this.h0 + this.v0 * Math.sin(this.rad) * t - 0.5 * g * t * t;
  }

  // 지면에 착륙할 때까지 걸리는 시간
  landingTime() {
    const g = 9.81;
    const vy = this.v0 * Math.sin(this.rad);
    return (vy + Math.sqrt(vy ** 2 + 2 * g * this.h0)) / g;
  }
}

사용 예시

const p = new Projectile(5, 2, 45);

console.log(p.horiz(0.2));    // 수평 이동 거리
console.log(p.height(0.2));   // 0.2초 후의 높이
console.log(p.landingTime()); // 착륙까지 걸리는 시간

실행 결과

0.282842712474619

결과 검증

초기 속도 v₀ = 2, 발사 각도 θ = 45°, 시간 t = 0.2초일 때 수평 거리는 다음과 같습니다.

x = 2 × cos(45°) × 0.2 = 2 × 0.7071 × 0.2 ≈ 0.2828

같은 방식으로 나머지 값들도 확인할 수 있습니다.

  • 0.2초 후 높이: 5 + 2 × sin(45°) × 0.2 − ½ × 9.81 × 0.2² ≈ 5.0866
  • 착륙 시간: 약 1.164초 후 지면에 도달합니다.

주의할 점

각도를 라디안으로 변환하지 않고 Math.cos(45)처럼 호출하면, JavaScript는 45를 '45라디안'으로 해석해 약 0.5253이라는 전혀 다른 코사인 값을 반환합니다. 그 결과 수평 거리 계산이 모두 틀어지므로, 도→라디안 변환은 반드시 생성자에서 한 번만 처리해 두는 것이 안전하고 효율적입니다.