zzz6519003 / scheme-one-more

0 stars 0 forks source link

Exercise 2 #4

Open zzz6519003 opened 5 years ago

zzz6519003 commented 5 years ago

ボールを投げたときに飛ぶ距離を求める関数を以下の手順で書いてみようと思います。 角度の度を弧度法単位(ラジアン)に変換する関数。 180 度は π ラジアンである。 π の定義は、 (define pi (* 4 (atan 1.0))) を用いよ。 速度 vx で等速運動するものが t 秒間に移動する距離を求める関数。 垂直方向の初速度 vy で投げたものが落ちてくるまでの時間を 計算する関数。 空気抵抗は無視し、重力加速度 g は 9.8 m s-2 とする。 ヒント:落ちてくるときの速度は -vy になっているから、 2 vy = g t が成り立つ。ここで t は落ちてくるのにかかる時間である。 1--3 の関数を利用して、初速度 v で角度 theta 度で投げたものが飛ぶ距離を求める関数。 ヒント:まず、最初に関数を利用して角度 theta を弧度法単位に換算する(それを theta1 とする)。 垂直、水平方向の初速度はそれぞれ v sin(theta1), v cos(theta1) で表される。 落ちてくるまでにかかる時間は関数3を用いて計算できる。 水平方向に加速度はかからないので、飛ぶ距離は関数2を用いて計算できる。 初速度 40 m s-1, 角度 30 度で投げたボールが飛ぶ距離を上で定義した関数を用いて求めよ。 (肩の強いプロ野球選手が遠投したときの距離に近い値になります。)


(define pi (* 4 (atan 1.0)))

(define (degreeToRadian degree)
  (* (/ degree 180) pi))

(define (dx vx t)
  (* vx t))

(define (ff-time vy)
  (/ (* 2.0 vy) 9.8))

; distance
(define (distance v ang)
  (dx
   (* v (cos (degreeToRadian ang)))                     ; vx
   (ff-time (* v (sin (degreeToRadian ang))))))         ; t