プログラミング

【高校物理】モンキーハンティング

サルも木から落ちる!?

高校物理のおもしろい実験に「モンキーハンティング」というものがあります。どういうものかというと

「猟師が銃で木につかまっているサルを狙っている。猟師はまっすぐサルを狙っていて、銃口の延長線上にサルがいます。猟師が銃を撃ったと同時にサルが木から手を離し、落下して弾を避けようとしました。さて、サルは助かるだろうか。」というものです。

結論から言うと、サルは助かりません。その様子をアニメーションにしてみました!ぜひ目で見て確認してみてください。

【モンキーハンティング】

左下から弾が2つ発射され、それと同時に右上からサルが落ちます。

弾の一方は重力を受けて放物線を描き、他方はまっすぐ進みます。

サルの落ち始めたところに影が残っていて、まっすぐ弾がサルに向かって放たれたことが確認できます。

確認できましたか??なぜサルが助からないのでしょう。解説していきます!

  • 重力によって弾も放物線を描く!
  • 式で読み解こう!
  • アニメーションについて

重力で落ちるのはサルも弾も同じ

サルが木から手を離せば、重力によって落ちることは想像がつきます。しかし、猟師に撃つ弾は速いので、感覚てきには言葉通り「まっすぐ進む」という勘違いを起こしやすいです。

しかし!銃弾だって重力を受けるため、その軌道はボールを投げたときと同じような放物線を描くのです!

今回のこの「モンキーハンティング」の実験では、サルが木から落ちた分と、弾が放物線を描いて軌道がずれた分がぴったり一致するため、サルに弾が命中するのです。

物理的に読み解いてみよう!!

さて、これを物理の数式で読み解いてみましょう。

STEP1 サルが落ちていく軌道に弾がたどり着くまでの時間を求める

サルと猟師の水平方向の距離をL〔m〕、弾の初速をv0〔m/s〕、弾の発射角度をθ〔rad〕とすると、弾の初速の水平成分vx

vx = v0cosθ〔m/s〕

と表せる。弾は水平方向には等速直線運動をするので、サルの落下軌道にたどり着くまでの時間t〔s〕は

t = L/vx = L/v0cosθ〔s〕

である。

STEP2 サルが落下して今いる高さを求める

この時間t〔s〕の間にサルがどれだけ落下して高さ何mにいるかを求める。

もともとサルがいた高さをh0〔m〕とする。サルが重力によって自由落下し、落ちた距離をd〔m〕とすると

d = (1/2)×gt2〔m〕

と表すことができる。(見づらいけど、ただの自由落下の公式だよ!) よって、サルの現在の高さh1〔m〕は

h1 = h0 - d = h0 - (1/2)×gt2〔m〕

となる。

STEP3 弾の高さを求める

この時間t〔s〕の間に弾が達する高さを求める。弾の初速の鉛直成分vy

vy = v0sinθ〔m〕

であり、弾は鉛直方向には鉛直投げ上げと同じ運動をするため、弾の高さh2〔m〕は

h2 = v0sinθ・t - (1/2)×gt2〔m〕

と表せる。

STEP4 弾の発射角度の条件を整理する

発射角度θ〔rad〕には、まっすぐサルに向かうという条件がある。この条件を整理しておく必要がある。サルと猟師、サルの真下の地点で直角三角形を考えると、

sinθ = h0 / √(L2 + h02)  cosθ = L / √(L2 + h02)

となる。

STEP5 h1とh2に求めたものをそれぞれ代入

h1〔m〕とh2〔m〕に時刻t〔s〕、sinθ、cosθをそれぞれ代入して整理すると

h1 = h0 - (1/2)×gt2 = h0 - g(L2 + h02) / 2v02

h2 = v0sinθ・t - (1/2)×gt2 = h0 - g(L2 + h02) / 2v02

となり、同じ値になることが確認できます!(h2の計算はやや複雑だけど、丁寧に計算を進めれば出るはずだよ!)以上より、同じ時刻に同じ鉛直軌道上の同じ高さにいることが確認できたので、サルは撃ち抜かれるとわかりました!

アニメーションのコードについて

アニメーションはJavaScriptで作成しています!

サルと弾、サルの影とまっすぐ進む弾をそれぞれHTMLの<canvas>内に描写しています。参考にコードを載せておくので、いろいろいじってみてください!

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
    <script src="main.js" defer></script>
    <title>モンキーハンティング</title>
</head>
<body>
    <canvas id="main" height="500px" width="500px"></canvas>
</body>
</html>
const main = document.getElementById("main");
const context = main.getContext("2d");

const gravity = 9.8 / 150;

let mX = 450;
let mY = 50;
let mVelY = 0;

let msX = 450;
let msY = 50;

let bX = 50;
let bY = 450;
let bVelX = 5;
let bVelY = -5;

let bsX = 50;
let bsY = 450;
let bsVelX = 5;
let bsVelY = -5;

function fill(x, y) {
    context.fillRect(x, y, 8, 8);
}

function draw() {
    context.fillStyle = "#000";
    context.fillRect(0, 0, 500, 500);

    mVelY += gravity;
    mY += mVelY;
    context.fillStyle = "#fff";
    fill(mX, mY);

    bVelY += gravity;
    bX += bVelX;
    bY += bVelY;
    fill(bX, bY);

    bsX += bsVelX;
    bsY += bsVelY;
    fill(bsX, bsY);
    
    context.fillStyle = "#888";
    fill(msX, msY);
}

function move() {
    draw();

    window.requestAnimationFrame(move);
}

move();

簡単に解説すると

HTMLの<canvas>にはJavaScriptで描画ができます。

JavaScriptの最初の2行がHTMLの情報を取得している部分です。window.requestAnimationFrame(move”)で何度も何度も重ねて描画し、アニメーションさせています。

サル、2つの弾には時間ごとに座標を変化させて、描画するたびに位置がずれるようにしています。

そのうちこのアニメーションについても記事を上げますね!!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA